Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 282
redgeoff Avatar asked Aug 16 '14 08:08

redgeoff


1 Answers

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.

like image 165
Benjamin Gruenbaum Avatar answered Oct 19 '22 12:10

Benjamin Gruenbaum