【问题标题】:How can I make a waterfall Q promises?我怎样才能做出瀑布式的 Q 承诺?
【发布时间】:2015-07-10 16:04:22
【问题描述】:

我们以这个为例:

  • 我在一个数组 urls 中有 3 个 url
  • require 函数返回一个只进行 $http 调用的承诺

这是一个工作代码,但由于数组可以是“1 到 n”,这显然不是我想要的。 我需要 3 个要求作为瀑布,而不是并行。 在最后一个承诺中,我需要解决一个最终承诺,即 var deferred。

require(urls[0]).then(function () {                            
    require(urls[1]).then(function () {                                
        require(urls[2]).then(function () {                                    
            deferred.resolve();
        });
    });
})

这种方法不起作用,因为这将并行执行所有 $http 调用。

var promises = [];
angular.forEach(urls, function (value) {
    promises.push(require(value));
});
$q.all(promises).then(function () {
    deferred.resolve();
});

有没有使用 for/cycle 的好方法?

【问题讨论】:

    标签: javascript angularjs promise q deferred


    【解决方案1】:

    创建一个函数来处理迭代:

    function go (urls) {
        if (urls[0]) {
          require(urls[0]).then(function () {
              go(urls.slice(1));
          });
        }
    }
    
    go(urls);
    

    【讨论】:

    • 应该是:function go(urls, i){ ... }
    • go(urls, ++i)} 中有一个中断的 };
    • 没问题。我对其进行了简化以删除i 参数并修复了错误。
    【解决方案2】:

    这是一篇很棒的博文:http://www.codeducky.org/q-serial/

    我只会分享相关的部分。

    首先我们定义这个辅助方法:

    function serial(tasks) {
      var prevPromise;
      angular.forEach(tasks, function (task) {
        //First task
        if (!prevPromise) { 
          prevPromise = task(); 
        } else {
          prevPromise = prevPromise.then(task); 
        }
      });
      return prevPromise;
    }
    

    然后我们使用它。

    serial([
      function() { return require(urls[0]) },
      function() { return require(urls[1]) },
      function() { return require(urls[2]) }
    ]).then(function () {
        deferred.resolve();
    });
    

    【讨论】:

    • 我也喜欢你的回答人,但另一个是天才:)
    【解决方案3】:

    只是提供另一种方法,对此有一个"one-line" solution,而无需另一种方法:

    return promises.reduce($q.when, promises[0]);
    

    在此处查看演示:http://plnkr.co/edit/xlGxYj57lzXdAMM5Iv6s?p=preview(我将默认 $q.when 更改为其他内容以显示处理每个承诺。)

    更新:使 plunker 更能代表 OP 的场景。

    【讨论】:

    • 这不会触发第一个承诺两次吗?
    猜你喜欢
    • 2016-08-18
    • 2016-08-28
    • 2022-12-09
    • 2019-06-19
    相关资源
    最近更新 更多