Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sequential execution of functions using promises

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.

like image 769
Denys Séguret Avatar asked Nov 02 '22 04:11

Denys Séguret


1 Answers

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.

( from the changelog )

Please update to the most recent version. This will cause the code to run correctly.

like image 141
Benjamin Gruenbaum Avatar answered Nov 15 '22 04:11

Benjamin Gruenbaum