【问题标题】:How to use Q.all with delay?如何延迟使用 Q.all?
【发布时间】:2014-07-05 03:13:35
【问题描述】:

我在数组allFunctions 中有一堆函数。我希望他们一个接一个地被执行,他们之间有延迟。我能想到的最接近的是:

result = Q();

allFunctions.forEach(function(fn) {
  result = result.then(fn).delay(1000);
})

这可能与Q.all 语法有关吗?

提前谢谢你:)

【问题讨论】:

    标签: node.js promise q


    【解决方案1】:

    没有意义,promise 是一个已经开始的操作,Q.all 等待所有操作一起完成。

    您目前拥有的是执行此操作的常用方法,它与同步版本(带有睡眠的 for 循环)非常相似。

    不过,您可以使用 Array.prototype.reduce 将其缩短一点:

    var result = allFunctions.reduce(function(prev,fn){
        return prev.then(fn).delay(1000);
    },Q());
    

    【讨论】:

      【解决方案2】:

      你可以在你的函数之间嵌套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 的静态对应物。
      • @BenjaminGruenbaum 我说的是使用将 a then 放在前一个上的新函数进行 reduce :) 不使用 then 本身
      猜你喜欢
      • 1970-01-01
      • 2011-06-19
      • 2023-03-05
      • 1970-01-01
      • 2015-07-12
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多