Reputation: 382150
I want to sequentially execute some asynchronous functions based on an array.
I thought this would do it :
var Promise = require("bluebird");
Promise.cast([1,2,3]).reduce(function(_,i){
console.log("Launching " + i);
return Promise.delay(Math.floor(Math.random()*1000)).then(function(){
console.log("Executing " + i);
});
},0);
but I get
Launching 1
Launching 2
Launching 3
Executing 2
Executing 1
Executing 3
instead of the desired result which would be
Launching 1
Executing 1
Launching 2
Executing 2
Launching 3
Executing 3
How can I ensure wholly sequential execution here ?
Note that I know how to do that without promises, I'm only interested in full promises solutions.
Upvotes: 5
Views: 1562
Reputation: 276306
You are using an old version of Bluebird. The behavior of .reduce
was changed in v1
to work this way:
Like
.map
and.filter
,.reduce
now allows returning promises and thenables from the iteration function.
Please update to the most recent version. This will cause the code to run correctly.
Upvotes: 2