Heim > Web-Frontend > js-Tutorial > Brauchen wir Promise.allSettled()?

Brauchen wir Promise.allSettled()?

DDD
Freigeben: 2024-11-30 16:47:14
Original
740 Leute haben es durchsucht

Do we need Promise.allSettled()?

Was halten Sie von Promise.allSettled()?

AllSettled sieht für mich wie eine Lösung auf der Suche nach einem Problem aus. Das Problem besteht darin, dass Entwickler Fehler nicht behandeln.

Das Konzept

Promise.allSettled() hat ein sehr einfaches Design:

const allSettled = (promises) => Promise.all(promises.map(entry => entry
  .then((value) => ({ status: 'fulfilled', value }))
  .catch((reason) => ({ status: 'rejected', reason }))
));
Nach dem Login kopieren

Es stellt ein „konsistentes“ Ergebnisobjekt bereit – nun, der Status ist konsistent, sodass Sie .filter() sauberer verwenden können als Object.hasOwn(), aber Wert und Grund sind absichtlich unterschiedlich, sodass Sie sie nicht verwechseln können.

Meistens fügt allSettled jedem Versprechen für Sie eine .catch() hinzu.

Behandeln Sie Ihre Fehler

Aber hier ist mein Knackpunkt: Wenn Sie eine Gruppe von Diensten parallel aufrufen und wissen, dass einer oder mehrere ausfallen können, es aber nicht wirklich wichtig ist ... warum schreiben Sie dafür keine Fehlerbehandlung?

const getFlakyService = (payload) => fetch(flakyUrl, payload);

Promise.allSettled([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((outcomes) => outcomes
  .filter(({ status }) => status === 'fulfilled'))
});
Nach dem Login kopieren

Wie viel Aufwand sparen wir im Vergleich dazu:

const getFlakyService = (payload) => fetch(flakyUrl, payload)
  // We don't really care about the failures
  .catch(() => undefined);

Promise.all([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((data) => { /* ... */ });
Nach dem Login kopieren

Wenn es Ihnen wichtig ist, welche Anrufe fehlschlagen, benötigen Sie wahrscheinlich die zur Nachverfolgung zugänglichen Anforderungsinformationen, deren Verfügbarkeit im Grund nicht garantiert ist. Promise.allSettled ist in diesem Fall noch weniger hilfreich und es ist sinnvoller, eine eigene Fehlerbehandlung zu schreiben.

const getFlakyService = (payload) => fetch(flakyUrl, payload)
  // Send the failures details to a tracking/logging layer
  .catch((error) => trackRequestError(flakyUrl, payload, error);

Promise.all([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((data) => { /* ... */ });
Nach dem Login kopieren

Ich gebe zu, dass die Standardisierung des „Ergebnisses“ praktisch sein könnte. Mit allSettled können Sie die Fehler zählen, sobald sie alle abgeschlossen sind. Aber das gilt auch für die benutzerdefinierte Fehlerbehandlung.

Abschluss

Ich werde Promise.all() in naher Zukunft weiterhin verwenden, aber ich bin daran interessiert, mehr über Ihre Anwendungsfälle für Promise.allSettled() zu erfahren und warum Sie es bevorzugen.

Das obige ist der detaillierte Inhalt vonBrauchen wir Promise.allSettled()?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
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