How can I sequentially chain promises using bluebirdjs?

后端 未结 2 500
被撕碎了的回忆
被撕碎了的回忆 2020-12-06 18:13

Promise.all() doesn\'t guarantee that promises will be resolved in order. How can this be done?

相关标签:
2条回答
  • 2020-12-06 18:50

    The thing that confused me most is that the async function being chained needs to return a function that returns a promise. Here's an example:

    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');
    });
    

    Notice that foo returns a function that returns a promise. foo() does not return a promise directly.

    See this Live Demo

    0 讨论(0)
  • 2020-12-06 19:00

    Since you're using Bluebird JS, this can be actually done in a simple way.

    In version 2.0, Bluebird introduced the Promise.each method that does this, for looping a then is simple enough, but since it is so common and got requested time after time eventually it was added as its own method.

    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)
    });
    

    Which produces the same result as the other answer, only with less lines of code and it also lets Bluebird perform optimizations on the iteration.

    0 讨论(0)
提交回复
热议问题