如何在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
。