JavaScript/Objekte/Promise/race

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die Methode Promise.race dient dazu, eine Anzahl gleichzeitig schwebender Promises in einem Promise zu konsolidieren. Außer Promises können auch Thenables übergeben werden.

Man erhält ein Promise, mit dessen Hilfe man auf das erste festgelegte Promise warten kann.

Die Übergabe anderer Werte, wie z. B. bei Promise.all, ist auch hier möglich, ergibt aber kaum einen Sinn, weil ein solcher Wert einem bereits erfüllten Promise entspricht und race() sofort beendet.

Syntax

   const promise = Promise.allSettled( promises );

Parameter

promises
muss ein iterierbares Objekt sein (beispielsweise ein Array), das beim Durchlaufen die Promises liefert, die konsolidiert werden sollen.

Rückgabe

Ein Promise, das den Zustand desjenigen übergebenen Promises wiedergibt, das zuerst festgelegt wird.

Eigenschaften

Hinweis: Jedes Promise ist auch ein Thenable!

Die Promise.race-Methode durchläuft die übergebenen Werte mit Hilfe des Iterator-Protokolls. Wenn sie dabei auf einen Thenable-Objekt trifft, registriert sie die erforderlichen Callbacks, um das Ergebnis dieses Thenable zu übernehmen.

Der erste Callback, der aufgerufen wird, legt den Zustand und den Wert des Rückgabepromises fest.

Ein echter Anwendungsfall für race() wird noch gesucht. Es gibt einige Ideen, die sich aber besser mit anderen Mitteln lösen lassen.

fetch mit Timeout
Geht als race des fetch-Promise gegen ein Promise unserer warte-Funktion. Besser ist es aber, fetch ein AbortSignal mit timeout zu übergeben.
fetch mit Cancel-Funktion
gleiches Thema, hier kann ein AbortController das AbortSignal setzen
Resource-Hedging
Damit ist gemeint, dass man eine Ressource an mehreren Stellen anfragt und das erste Ergebnis verwendet. Hier ist aber Promise.any() besser geeignet, weil man ja den ersten Erfolg haben möchte

Das beste Beispiel dürfte ein Pool von Worker-Threads sein. Der Main-Thread hat eine Aufgabe, die erledigt werden muss, und schickt sie an alle Worker. Diese haben möglicherweise eine Warteschlange von Aufgaben und stellen die Anforderung darin ein. Irgendwann beginnt einer der Worker die Aufgabe und kann ein "jetzt geht's los" Signal zurückmelden, woraufhin sich beim Main-Thread ein Promise erfüllt. Möglicherweise stellt der Worker aber auch fest, dass das Aufgabenpaket ungültig ist und liefert eine Fehlermeldung, woraufhin man das Promise zurückweist. Mit race() kann der Main-Thread auf die Signale aller Worker warten, ggf. auch den Fehler feststellen und nach Antwort des ersten Workers den übrigen Workern signalisieren, dass sich die Aufgabe erledigt hat.

Dieses Beispiel ist allerdings zu umfangreich, um es in einem Wiki-Artikel vorzustellen.

Siehe auch

  • Promise.any: Variante von race, die sich dann fulfilled, wenn das erste der übergebenen Promises erfüllt wird
  • Promise.allSettled: Eine Concurrency-Methode, die nicht nach dem ersten fertigen Promise aufhört, sondern wartet, bis alle übergebenen Promises festgelegt sind.