2014-03-04 6 views
5

Ich möchte einige asynchrone Funktionen sequentiell basierend auf einem Array ausführen.Sequenzielle Ausführung von Funktionen mit Versprechungen

dachte ich, das würde es tun:

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

aber ich bekomme

Launching 1 
Launching 2 
Launching 3 
Executing 2 
Executing 1 
Executing 3 

anstelle des gewünschten Ergebnis, das

Launching 1 
Executing 1 
Launching 2 
Executing 2 
Launching 3 
Executing 3 

wäre Wie kann ich ganz sequentielle Ausführung gewährleisten Hier ?

Beachten Sie, dass ich weiß, wie man das ohne Versprechungen macht, ich bin nur an vollen Versprechungen interessiert.

Antwort

2

Sie verwenden eine alte Version von Bluebird. Das Verhalten von .reduce wurde in v1 verändert auf diese Weise zu arbeiten:

Wie .map und .filter, .reduce jetzt erlaubt Versprechungen und thenables aus der Iteration Funktion zurückkehrt.

(from the changelog)

Bitte aktualisieren Sie auf die neueste Version. Dies führt dazu, dass der Code korrekt ausgeführt wird.

+1

Ja, die Aktualisierung von Bluebird auf 1.0.8 behob das Problem. –

+1

Wenn jemand dies liest und auf einer '