2016-06-20 12 views
1
q.reduce

Ich habe ein Stück Code, der die q Versprechen Bibliothek wie folgt verwendet:Versprechen q.allSettled

var q = require('q') 
var promises = [ promise1, promise2, promise3] 
q.allSettled(promises) 
    .then(function(results) { 
     for(var i=0; i<results.length; ++i) { 
      if(results[i].state = 'fulfilled') { //do Something on success} 
      else{ //do something on failure} 
     } 
}) 

Dies führt alle Versprechungen parallel. Wie kann ich dies in sequentielle Ausführung konvertieren? Ich schaute mich um Q Documentation und der Vorschlag war, [].reduce für die sequentielle Ausführung zu verwenden. Ich habe versucht, dasselbe zu benutzen, aber ohne viel Glück.

Irgendwelche Vorschläge würden geschätzt.

+0

Was genau funktioniert nicht mit reduzieren? – robertklep

+0

Bitte zeigen Sie uns den (gescheiterten) Versuch mit 'reduce', nicht dem funktionierenden' allSettled' Code. – Bergi

+0

Für die sequentielle Ausführung müssen Sie * die Funktionen * aufrufen, die 'provideN 'sequentiell erzeugen, wenn Sie bereits 3 Versprechen haben, können Sie nichts tun. Bitte zeigen Sie uns diesen Code auch. – Bergi

Antwort

0

Es gibt keine "Versprechen". Promises sind ein Proxy für das Ergebnis von asynchronen Operationen. Das Ausführen eines Versprechens ist ähnlich wie das Ausführen der Nummer 5.

Was Sie können synchron ausgeführt werden, ist Funktionen, Versprechen zu versprechen. Dies kann reduce tun.

können Sie eine .reflect primitive anstelle von allSettled:

var functions = [promiseReturningFn1, promiseReturningFn2, promiseReturningFn3]; 
functions.reduce((soFar, current) => { 
    return soFar.then(() => // wait for previous actions 
    return current().reflect(); 
    }); 
}, Q()); 

und Gebäude .reflect() da Q es nicht hat:

Q.prototype.reflect = function() { 
    var p = this; 
    return p.then(v => ({ state: "fulfilled", value: v }), 
      .catch(r => ({ state: "rejected", reason: r })); 
} 

Dadurch werden alle Aktionen nacheinander ausgeführt werden, sondern wird sie auch weiterhin laufen auf Fehler.

+1

Es gab zwei Dinge, die ich hier vermisste - das erste, das ich nicht das Versprechen nannte, sich sequenziell zurückzugeben. Die zweite ist die reflect() Implementierung. Das funktioniert perfekt! – user3638992

Verwandte Themen