2014-06-17 6 views
6

Ich habe mehrere Versprechen (P1, P2, ... Pn) Ich möchte sie in einer Sequenz (also Q.all ist keine Option) und ich würde sie ketten mag die Kette beim ersten Fehler brechen.
Jedes Versprechen kommt mit eigenen Parametern.
Und ich möchte jeden Versprechen Fehler abfangen, um den Fehler zu dumpen.Brechen Sie eine dynamische Folge von Versprechen mit Q

Wenn P1, P2, .. PN meine Versprechen sind, habe ich keine Ahnung, wie man die Sequenz automatisiert.

Antwort

3

Wenn Sie eine Kette von Versprechen haben, haben sie alle bereits begonnen und es gibt nichts, was Sie tun können, um eine von ihnen zu starten oder zu stoppen (Sie können abbrechen, aber das ist so weit wie es geht).

Angenommen, Sie haben F1,... FnVersprechen der Rückkehr Funktionen, können Sie den Grundbaustein Versprechen nutzen, unsere .then dafür:

var promises = /* where you get them, assuming array */; 
// reduce the promise function into a single chain 
var result = promises.reduce(function(accum, cur){ 
    return accum.then(cur); // pass the next function as the `.then` handler, 
        // it will accept as its parameter the last one's return value 
}, Q()); // use an empty resolved promise for an initial value 

result.then(function(res){ 
    // all of the promises fulfilled, res contains the aggregated return value 
}).catch(function(err){ 
    // one of the promises failed, 
    //this will be called with err being the _first_ error like you requested 
}); 

Also, die weniger kommentierte Version:

var res = promises.reduce(function(accum,cur){ return accum.then(cur); },Q()); 

res.then(function(res){ 
    // handle success 
}).catch(function(err){ 
    // handle failure 
}); 
+0

Dank ! Ich nehme jedoch an, dass das "aggregierte Ergebnis", das im letzten "dann" als Argument übergeben wurde, etwas ist, das ich selbst umsetzen muss, je nach meiner eigenen Bequemlichkeit. – Guid

+1

@Guid Es hängt von Ihrer API ab, ich nehme an, dass jedes Versprechen das Ergebnis des vorherigen erfordert (da Sie nacheinander nach ihnen gefragt haben). Sie könnten zum Beispiel - erstellen Sie ein Array außerhalb und drücken Sie es in der Schleife (vor dem 'return accum.then (cur);') -Teil, und dann '.return' die Ergebnisse. –