如何在Javascript中顺序运行Q的承诺?

我正在顺利地履行承诺。

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!") }) 

一旦whenATime()应该顺序输出[“一次”,“在”,“一个”,“时间”],而是他们正在输出立即出于某种原因。

jsFiddle here: http : //jsfiddle.net/6Du42/2/

任何想法我做错了什么?

而是由于某种原因立即输出。

你已经在这里打电话给他们了:

 promiseFuncs.push(getDelayedString(str)); // ^^^^^ 

你需要推function(){ return getDelayedString(str); } function(){ return getDelayedString(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()); } 

哦, 不要使用document.write