Umgang mit Versprechen mit gemischten Auflösungen
Bei der asynchronen Programmierung kann der Umgang mit Versprechenmengen eine Herausforderung darstellen. Stellen Sie sich ein Szenario vor, in dem Sie mehrere Netzwerkanforderungen haben und eine davon wahrscheinlich fehlschlägt. Standardmäßig stoppt Promise.all() den Prozess mit einem Fehler, sobald ein Versprechen abgelehnt wird. Dies ist möglicherweise nicht wünschenswert, wenn Sie Antworten auf alle Anfragen erfassen möchten.
Muster ohne Versprechensbibliothek
Eine Lösung ohne Verwendung einer Versprechensbibliothek besteht darin, jedes Versprechen mit zu verpacken eine „Spiegel“-Funktion. Diese Funktion gibt ein neues Versprechen zurück, das mit dem Wert oder Fehler des ursprünglichen Versprechens aufgelöst wird und eine „Status“-Eigenschaft enthält, die Erfolg oder Ablehnung angibt.
const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" }));
Sie können dann jedes Versprechen einem Reflexionsversprechen und einem Aufruf zuordnen Promise.all() für das zugeordnete Array:
var arr = [fetch('index.html'), fetch('http://does-not-exist')] Promise.all(arr.map(reflect)).then(function (results) { var success = results.filter(x => x.status === "fulfilled"); });
Mit diesem Ansatz können Sie sowohl erfolgreiche als auch abgelehnte Versprechen verarbeiten anmutig.
Eingebautes Promise.allSettled()
Beachten Sie, dass moderne Browser und JavaScript-Umgebungen jetzt über eine native Promise.allSettled()-Methode verfügen, die ähnliche Funktionen bietet. Es gibt ein Versprechen zurück, das mit einer Reihe von Ergebnissen aufgelöst wird, die jeweils den Status und Wert (falls erfüllt) des entsprechenden ursprünglichen Versprechens darstellen.
Das obige ist der detaillierte Inhalt vonWie kann ich in JavaScript mit mehreren Versprechen umgehen, auch mit abgelehnten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!