我很难按顺序执行诺言。
var getDelayedString = function(string) { var deferred = Q.defer(); setTimeout(function() { document.write(string+" "); deferred.resolve(); }, 500); return deferred.promise; }; var onceUponATime = function() { var strings = ["Once", "upon", "a", "time"]; var promiseFuncs = []; strings.forEach(function(str) { promiseFuncs.push(getDelayedString(str)); }); //return promiseFuncs.reduce(Q.when, Q()); return promiseFuncs.reduce(function (soFar, f) { return soFar.then(f); }, Q()); }; getDelayedString("Hello") .then(function() { return getDelayedString("world!") }) .then(function() { return onceUponATime(); }) .then(function() { return getDelayedString("there was a guy and then he fell.") }) .then(function() { return getDelayedString("The End!") })
OnceUponATime()应该顺序输出[“ Once”,“ upon”,“ a”,“ time”],但是由于某种原因,它们会立即输出。
知道我在做什么错吗?
但由于某种原因,它们却立即被输出。
您已经在这里打电话给他们:
promiseFuncs.push(getDelayedString(str)); // ^^^^^
您需要推动function(){ returngetDelayedString(str);}。顺便说一句,each您应该使用而不是在循环中使用推入数组map。实际上,您实际上并不需要,但是可以直接reduce遍历strings数组:
function(){ returngetDelayedString(str);}
each
map
reduce
strings
function onceUponATime() { var strings = ["Once", "upon", "a", "time"]; return strings.reduce(function (soFar, s) { return soFar.then(function() { return getDelayedString(s); }); }, Q()); }