Fangen Alle Versprechen Ablehnungen in eine Async-Funktion in JavaScript
Habe ich lief in ein Problem mit dem fangen alle Fehler, wenn mehrere Versprechungen werfen Ablehnung-Fehler nach erwartete in einer async-Funktion (javaScript - Knoten-v8.4.0).
Verweisen, um die folgenden javaScript-Code:
Referenz, die Funktionen timeoutOne() und timeoutTwo (), schicken Sie einfach einen einheimischen Versprechen, dass wird ein Wert nach einer 1-und 2-Sekunden-timeout bzw. ablehnen, oder mit einer Fehlermeldung, wenn ich "deviousState" auf "true".
let deviousState = true;
async function asyncParallel() {
try {
let res1 = timeoutOne();
let res2 = timeoutTwo();
console.log(`All done with ${await res1} ${await res2}`)
}
catch(err) {
console.log(err)
}
}
asyncParallel();
let pAll = Promise.all([timeoutOne(), timeoutTwo()]);
pAll.then((val) => {
console.log(`All done with ${val[0]} ${val[1]}`)
}).catch(console.log);
In beiden Fällen nur das Versprechen, dass gibt zunächst einen Fehler meldet. Ich weiß, dass einige Versprechen Bibliotheken es ist ein Weg, um melden Sie alle Fehler (zum Beispiel die "absetzen" - Methode in bluebird), allerdings bin ich mir nicht sicher, ob es eine Entsprechung für diese Methode in systemeigenen verspricht?
Auch, wenn beide zusagen ablehnen, dann asyncParallel() meldet sich ein nicht abgefangener Fehler mit dem Versprechen, lehnt letzten. Ist, da gibt es keinen eingebauten Mechanismus für asynchrone Funktion try /catch-Blöcke fangen mehrere Ablehnungen in dieser Art und Weise?
Alles funktioniert auf die gleiche in beiden Fällen, wenn das Versprechen zu lösen. Seine nur, dass wenn beide ablehnen, die Versprechen.alle Griffe der Fehler, und die async-Funktion version besagt, dass einer der unbehandelte Versprechen, Fehler, stürzt der Prozess in zukünftigen Versionen von Knoten.
Ist es trotzdem für den try /catch behandeln diese Art von Fehler, richtig? Oder muss ich immer noch auf ein Versprechen.alle innerhalb async-Funktionen, um sicherzustellen, dass der Fehler korrekt behandelt werden?
InformationsquelleAutor MFave | 2017-10-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja - Sie erstellt die
timeoutTwo()
Versprechen, aber nie behandelt, seine Fehler (wie in einemawait
). Dieawait res2
wurde nie ausgeführt, aufgrund der Ausnahme inawait res1
.(Beachte, dass es nicht "die Versprechen, lehnt letzten", aber immer das Versprechen, das ersehnte zweite).
In sequenziellen code, es können nicht mehrere Ausnahmen, so kommen zusätzliche syntax, um mit Ihnen umzugehen wäre schwer.
Ja, genau das. Wenn Sie warten für mehrere verspricht parallel dazu sollten Sie immer Verwendung
Promise.all
. Dieawait
Schlüsselwort ist einfach Zucker für die folgenden.then()
nennen.Sollten Sie schreiben
Nein, gibt es nicht. Die Eigenschaften von
settle
sind trivial zu implementieren, selbst mitthen
mit alle Werte, die Sie sich wünschen:InformationsquelleAutor Bergi