【发布时间】:2014-07-05 03:13:35
【问题描述】:
我在数组allFunctions 中有一堆函数。我希望他们一个接一个地被执行,他们之间有延迟。我能想到的最接近的是:
result = Q();
allFunctions.forEach(function(fn) {
result = result.then(fn).delay(1000);
})
这可能与Q.all 语法有关吗?
提前谢谢你:)
【问题讨论】:
我在数组allFunctions 中有一堆函数。我希望他们一个接一个地被执行,他们之间有延迟。我能想到的最接近的是:
result = Q();
allFunctions.forEach(function(fn) {
result = result.then(fn).delay(1000);
})
这可能与Q.all 语法有关吗?
提前谢谢你:)
【问题讨论】:
没有意义,promise 是一个已经开始的操作,Q.all 等待所有操作一起完成。
您目前拥有的是执行此操作的常用方法,它与同步版本(带有睡眠的 for 循环)非常相似。
不过,您可以使用 Array.prototype.reduce 将其缩短一点:
var result = allFunctions.reduce(function(prev,fn){
return prev.then(fn).delay(1000);
},Q());
【讨论】:
你可以在你的函数之间嵌套Q().delay( 1000 )
这意味着您必须将函数数组映射到:
function delay(){ return Q.delay(1000); }
var functions = [ f1, delay, f2, delay, f3 ];
Q.all 不会按顺序运行您的函数,您使用 prev.then 所做的事情是一个有趣的 hack,但您也可以按照 Q 建议的方式运行它(更多信息在这里 https://github.com/kriskowal/q#sequences):
var results = functions.reduce(Q.when, Q(initialVal));
在你的函数数组中插入延迟也可以更好地控制延迟(如果你最终想要不同的时间延迟)
【讨论】:
then 的链接承诺称为 hack。这是 Promise 代码库中极为常见的做法。做 Q.when 只是 then 的静态对应物。