Bluebird Promise.all - mehrere Versprechen abgeschlossen aggregierende Erfolge und Ablehnungen
Jemand brachte einen interessanten Fall heute mit bluebird, was ist der beste Weg, um mehrere verspricht, wo wir sind nicht daran interessiert, zu stoppen auf eine bestimmte Erfüllung oder Ablehnung, sondern eher daran interessiert inspizierte das Ergebnis. Ein Beispiel:
var p1 = new Promise(function(f,r){
setTimeout(function(){
console.log("p1");
f("yay");
}, 100);
});
var p2 = new Promise(function(f,r){
setTimeout(function(){
console.log("p2");
r(new Error("boo"));
}, 200);
})
var p3 = new Promise(function(f,r){
setTimeout(function(){
console.log("p3");
r(new Error("yay"));
}, 300);
});
var p4 = new Promise(function(f,r){
setTimeout(function(){
console.log("p4");
f("yay");
}, 400);
});
//Promise.all([p1,p2, p3, p4]).then(function(p){
// console.log("Results:",p);
//}).error(function(e){
// console.log("Error:",e);
//});
Promise.map([p1,p2, p3, p4],function(p){
console.log("results:",p);
}, {concurrency:10}).error(function(e){
console.log("Error:",e);
});
Hier, wenn wir laufen entweder anzeigen oder alle abgelehnt verspricht verursachen Handler nicht zum Bericht über die Ergebnisse.
Beispielsweise die Ergebnisse der Ausführung Versprechen.Karte wie oben umgesetzt ist:
debugger listening on port 65222
p1
results: yay
p2
Error: [Error: boo]
p3
p4
Process finished with exit code 0
Hier der code für jedes Versprechen führt, aber nur 1 Ergebnis und 1 ein Fehler gemeldet wird. Den Fehler verursacht der Prozess beendet.
Wenn wir kommentieren .alle bekommen wir ein ähnliches Verhalten. Dieses mal, nur der Fehler gemeldet wird. Erfolge machen es nicht in dann (verständlicherweise).
debugger listening on port 65313
p1
p2
Error: [Error: boo]
p3
p4
Process finished with exit code 0
Gegeben, dieses Verhalten, was wäre der beste Weg zu gehen über die Implementierung von einem Szenario, in dem alle Verheißungen ausführen und die Ergebnisse der erfüllten Verheißungen berichtet mit jedem und alle Ablehnungen?
Etwas wie:
Promise.aggregate([p1,p2,p3,p4]).then(function(fulfilled, rejected){
console.log(fulfilled); //all success
console.log(rejected); //any and all rejections/exceptions
});
InformationsquelleAutor der Frage j03m | 2014-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie verwenden würden,
.reflektieren
:Diese verwendet, um behandelt werden, mit einem
settle
Funktion, Tat dies für eine Reihe traditionell - es war verallgemeinert durch.reflect
da trennt sich die aggregation aus der Vorstellung von einem Versprechen Inspektion und Sie können tun, was.settle
hast, sondern andere Aktionen wie.any
oder.some
als gut.InformationsquelleAutor der Antwort Benjamin Gruenbaum