Heim > Web-Frontend > js-Tutorial > Wie kann ich alle Versprechen, auch die abgelehnten, in asynchronem JavaScript verarbeiten?

Wie kann ich alle Versprechen, auch die abgelehnten, in asynchronem JavaScript verarbeiten?

DDD
Freigeben: 2024-12-16 12:36:12
Original
338 Leute haben es durchsucht

How Can I Handle All Promises, Including Rejected Ones, in Asynchronous JavaScript?

Warten auf die Erfüllung aller Versprechen, trotz Ablehnungen

Bei der asynchronen Programmierung kann der Umgang mit Versprechen eine Herausforderung darstellen, wenn einige Aufgaben fehlschlagen. Betrachten wir das folgende Szenario:

const arr = [fetch('index.html'), fetch('http://does-not-exist')];

Promise.all(arr)
  .then(res => console.log('success', res))
  .catch(err => console.log('error', err)); // This is executed
Nach dem Login kopieren

Der obige Code stellt Netzwerkanfragen per Fetch durch. Da Promise.all jedoch bei der ersten fehlgeschlagenen Anfrage ablehnt, stoßen wir auf ein Problem: Wie können wir mit den Ergebnissen aller Aufgaben umgehen, auch mit denen, die fehlgeschlagen sind?

Native JavaScript-Lösung

An Um dieses Problem zu lösen, können wir die folgenden nativen JavaScript-Techniken einsetzen:

  1. Verwenden von Reflect, um einen Wrapper zu erstellen Versprechen:
const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" }));
Nach dem Login kopieren

Diese Reflektierungsfunktion gibt ein neues Versprechen zurück, das in ein Objekt aufgelöst wird, das entweder den aufgelösten Wert oder den Ablehnungsgrund enthält, zusammen mit einer Statuseigenschaft, die den Status des Versprechens angibt.

  1. Reflect auf alle anwenden Versprechen:
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");
});
Nach dem Login kopieren

In diesem Beispiel wenden wir „reflect“ auf jedes Versprechen im Array an. Das resultierende Array enthält nun ein Objekt mit Status- und Fehler- oder Werteigenschaften für jede Anfrage.

Moderne Alternative: Promise.allSettled

Für eine moderne Lösung sollten Sie die Verwendung des integrierten Promise.allSettled in Betracht ziehen :

Promise.allSettled([promise]).then(([result]) => {
  // Code will execute regardless of the promise's state
  // { status: "fulfilled", value: 33 }
});
Nach dem Login kopieren

Diese Methode bietet eine bequeme Möglichkeit, alle erfüllten Versprechen zu handhaben, unabhängig von ihrem Ergebnis.

Durch Hebelwirkung Mit diesen Techniken können Sie asynchrone Vorgänge elegant verwalten und auf die Ergebnisse aller Versprechen zugreifen, auch auf diejenigen, die fehlschlagen, sodass Sie fundierte Entscheidungen auf der Grundlage der verfügbaren Daten treffen können.

Das obige ist der detaillierte Inhalt vonWie kann ich alle Versprechen, auch die abgelehnten, in asynchronem JavaScript verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage