Fehlerbehandlung in Promise.all
Habe ich eine Reihe von Versprechungen, ich bin der Lösung mit Versprechen.alle(arrayOfPromises);
Gehe ich auf weiter das Versprechen Kette. Sieht so ähnlich aus wie diese
existingPromiseChain = existingPromiseChain.then(function() {
var arrayOfPromises = state.routes.map(function(route){
return route.handler.promiseHandler();
});
return Promise.all(arrayOfPromises)
});
existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
//do stuff with my array of resolved promises, eventually ending with a res.send();
});
Möchte ich hinzufügen, dass eine catch-Anweisung des Umgangs mit einer Person Versprechen, falls es Fehler, aber wenn ich versuche, Versprechen.alle Rücksendungen die ersten Fehler, die es findet (ignoriert den rest), und dann kann ich nicht die Daten aus dem rest der Versprechungen in das array (nicht-Fehler).
Habe ich versucht, etwas ähnliches ..
existingPromiseChain = existingPromiseChain.then(function() {
var arrayOfPromises = state.routes.map(function(route){
return route.handler.promiseHandler()
.then(function(data) {
return data;
})
.catch(function(err) {
return err
});
});
return Promise.all(arrayOfPromises)
});
existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
//do stuff with my array of resolved promises, eventually ending with a res.send();
});
Aber nicht beheben.
Dank!
--
Edit:
Was die Antworten unten gesagt wurden, völlig richtig, der code wurde brechen aus anderen Gründen. Falls es jemanden interessiert, dies ist die Lösung, die ich landete mit ...
Knoten-Express-Server-Kette
serverSidePromiseChain
.then(function(AppRouter) {
var arrayOfPromises = state.routes.map(function(route) {
return route.async();
});
Promise.all(arrayOfPromises)
.catch(function(err) {
//log that I have an error, return the entire array;
console.log('A promise failed to resolve', err);
return arrayOfPromises;
})
.then(function(arrayOfPromises) {
//full array of resolved promises;
})
};
API-Aufruf der route.async-Aufruf)
return async()
.then(function(result) {
//dispatch a success
return result;
})
.catch(function(err) {
//dispatch a failure and throw error
throw err;
});
Setzen die .fangen Versprechen.alle vor dem .dann scheint Sie diente dem Zweck, die fangen alle Fehler von den ursprünglichen Versprechungen, aber dann wieder das gesamte array an die nächste .dann
Dank!
InformationsquelleAutor der Frage Jon | 2015-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Promise.all
ist alles oder nichts. Er verrechnet wird, wenn alle Versprechungen, die in das array auflösen, oder ablehnen, sobald eine von Ihnen ablehnt. In anderen Worten, entweder es löst sich mit einem array gelöst werden Werte, oder lehnt Sie mit einem einzigen Fehler.Einige Bibliotheken haben etwas namens
Promise.when
die ich verstehen würde, anstatt zu warten, für alle verspricht im array entweder beheben oder ablehnen, aber ich bin nicht vertraut mit es, und es ist nicht in ES6.Ihren code
Stimme ich mit anderen hier, dass Ihr fix funktionieren sollte. Sollte es lösen, mit einem array enthalten können, eine Mischung aus erfolgreichen Werte-und Fehler-Objekte. Es ist ungewöhnlich, passieren Fehler-Objekte in der Erfolgs-Pfad aber nur dann, wenn Ihr code erwartet wird, sehe ich kein problem mit.
Der einzige Grund, der mir einfällt, warum es würde "nicht aufgelöst" ist, dass es andernfalls im code sind Sie nicht und zeigen Sie uns und der Grund, warum man Sie nicht sehen, eine Fehlermeldung über dieses ist, weil dieses Versprechen Kette nicht terminiert ist, mit einer endgültigen fangen (so weit wie, was Sie zeigen uns jedenfalls).
Ich habe mir die Freiheit genommen, factoring out "bestehende Kette" von Ihrem Beispiel, und beenden Sie die Kette mit einem Haken. Dies kann nicht richtig sein für Sie, aber für Leute, die dies Lesen, ist es immer wichtig, entweder zurückzugeben oder zu beenden, Ketten oder potenzielle Fehler, auch Fehler codieren, wird ausgeblendet (das ist, was ich vermute, hier passiert):
InformationsquelleAutor der Antwort jib
wenn Sie den q-Bibliothek https://github.com/kriskowal/q
es hat q.allSettled () - Methode, die dieses problem löst
Sie können es mit jeder Versprechen je nach Ihrem Zustand entweder eingehalten oder abgelehnt
so
InformationsquelleAutor der Antwort Mohamed Mahmoud
Wir haben das schreiben eines benutzerdefinierten Versprechen.alle().
Hier die Lösung, die ich verwenden in meinem Projekt. Fehler wird zurückgegeben werden, als normales Ergebnis.
Nach allen Versprechungen beenden, können wir die filter-out-Fehler.
InformationsquelleAutor der Antwort Solominh
So
Promise.all
ist entworfen, um zu arbeiten. Wenn ein einzelner Versprechenreject()
's, die komplette Methode sofort fehl.Gibt es Anwendungsfälle, wo man vielleicht die
Promise.all
so dass für verspricht zu scheitern. Um dies möglich zu machen, einfach benutzen Sie keinereject()
Aussagen in Ihrem Versprechen. Jedoch, um sicherzustellen, dass Ihre app/script friert nicht bei jedem einzelnen zugrunde liegenden Versprechen nie bekommt eine Antwort, die Sie benötigen, um ein timeout auf.InformationsquelleAutor der Antwort Ron Royston
Können wir behandeln die Ablehnung an die individuelle verspricht Ebene, also Wann bekommen wir die Ergebnisse in unserem Ergebnis-array, array-index, der abgelehnt worden ist, wird nicht definiert, und wir können diese situation meistern, wie wir brauchen. Und die restlichen Ergebnisse.
Hier habe ich abgelehnt, das erste Versprechen, so kommt es zu undefinierten, aber wir können mit dem Ergebnis für das zweite Versprechen, das ist bei index 1.
InformationsquelleAutor der Antwort Nayan Patel
Schrieb ich einen npm-Bibliothek, um mit diesem problem umzugehen mehr schön.
https://github.com/wenshin/promiseallend
Installieren
2017-02-25 neue api, ist es nicht brechen Versprechen Prinzipien
--------------------------------
Alte schlechte api, verwenden Sie es nicht!
InformationsquelleAutor der Antwort wenshin