【问题标题】:How can I sequentially chain promises using bluebirdjs?如何使用 bluebirdjs 顺序链接承诺?
【发布时间】:2014-08-16 08:23:02
【问题描述】:

Promise.all() 不保证承诺会按顺序解决。如何做到这一点?

【问题讨论】:

    标签: javascript promise chaining chain bluebird


    【解决方案1】:

    由于您使用的是 Bluebird JS,这实际上可以通过简单的方式完成。

    在 2.0 版中,Bluebird 引入了执行此操作的 Promise.each 方法,因为循环 a then 很简单,但由于它非常常见并且一次又一次地被请求,最终它被添加为自己的方法。

    function foo(item, ms){ // note bluebird has a delay method
        return Promise.delay(ms, item).then(console.log.bind(console))
    }
    
    var items = ['one', 'two', 'three'];
    
    Promise.each(items, function(item, i){
        return foo(item, (items.length - i) * 1000)
    });
    

    这会产生与另一个答案相同的结果,只是代码行更少,而且它还允许 Bluebird 对迭代执行优化。

    【讨论】:

      【解决方案2】:

      最让我困惑的是,被链接的异步函数需要返回一个返回承诺的函数。这是一个例子:

      function setTimeoutPromise(ms) {
        return new Promise(function (resolve) {
          setTimeout(resolve, ms);
        });
      }
      
      function foo(item, ms) {
        return function() {
          return setTimeoutPromise(ms).then(function () {
            console.log(item);
          });
        };
      }
      
      var items = ['one', 'two', 'three'];
      
      function bar() {
        var chain = Promise.resolve();
        items.forEach(function (el, i) {
          chain = chain.then(foo(el, (items.length - i)*1000));
        });
        return chain;
      }
      
      bar().then(function () {
        console.log('done');
      });
      

      注意 foo 返回一个返回承诺的函数。 foo() 确实直接返回一个承诺。

      看到这个Live Demo

      【讨论】:

      • then() 被这样调用时,你为什么要返回chain.then(),它实际上除了复制承诺之外什么都不做。
      • Benjamin 的例子肯定更简单。我在处理 pouchdb 中的 lie promise lib (github.com/calvinmetcalf/lie) 时开发了我的,在这种情况下不支持 each() 调用。我的问题应该真的引用了 liejs 而不是 bluebirdjs :)。
      • @BenjaminGruenbaum 你会如何使用我的代码链接这些承诺?我仍在学习 Promise 的细微差别,因此非常感谢您的意见。
      • return chain 而不是 return chain.then()
      • 是的,错过了那个:)
      猜你喜欢
      • 2014-10-31
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 2017-08-30
      相关资源
      最近更新 更多