Search code examples
javascriptpromisechainingchainbluebird

How can I sequentially chain promises using bluebirdjs?


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


Solution

  • 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.