JavaScript/Objekte/Promise/then

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die Methode then von Promise.prototype registriert Callback-Funktionen auf einem Promise, die aufgerufen werden, sobald das Promise auf einen Wert festgelegt wird.

Bitte lies zum besseren Verständnis auch das Einführugstutorial zu Promises.

Syntax

   promiseB = promiseA.then(onFulfilled, onRejected);

Parameter

onFulfilled
Eine Callback-Funktion, die aufzurufen ist, wenn Promise A auf den Zustand fulfilled festgelegt wird. Sie erhält den Wert als Argument, mit dem der fulfilled-Zustand gesetzt wurde.
Wird etwas anderes als eine Funktion übergeben, verhält sich das Promise so, als wäre ein Dummy-Handler (x) => x registriert worden.
onRejected (optional)
Eine Callback-Funktion, die aufzurufen ist, wenn Promise A auf den Zustand rejected festgelegt wird. Sie erhält den Wert als Argument, mit dem der rejected-Zustand gesetzt wurde.
Wird etwas anderes als eine Funktion übergeben oder der Parameter weggelassen, verhält sich das Promise so, als wäre ein Throw-Handler (x) => { throw x; } registriert worden.

Hinweis: Bei Mozilla heißt es, dass der Dummy- oder Throw-Handler tatsächlich registriert würde. Das ist aber nicht das, was in der ECMAScript-Spezifikation steht.

Rückgabewert

Man erhält ein neues „Promise B“, dessen Zustand und Wert festgelegt werden, nachdem Promise A festgelegt wurde und der mit then registrierte zugehörige Callback zurückgekehrt ist. Die Rückgabe von Promise B erfolgt unverzüglich, nachdem die Callbacks registriert wurden. then wartet nicht darauf, ob und wie sich Promise A festlegt.

Thenable

Eine then-Methode kann auch von Objekten bereitgestellt werden, die keine eingebauten Promises der JavaScript-Engine sind. In diesem Fall spricht man von einem Thenable-Objekt (sozusagen „zu then fähig“) und JavaScript erwartet, dass sich diese then-Methode zumindest grob so verhält, wie es die Promise A+-Spezifikation vorschreibt.

Von der then-Methode eines beliebigen Thenable-Objekt kann natürlich nicht erwartet werden, dass sie ein natives Promise-Objekt zurückgibt. Für echte Promises, die mit einem Thenable erfüllt werden, ist das auch nicht von Bedeutung, weil sie lediglich versuchen, den Zustand des Thenable über fulfilled- und rejected-Handler zu übernehmen. Solange das Thenable dies ermöglicht, ist es kompatibel genug.

Weitere Eigenschaften

Die then Methode kann auf dem Promise A beliebig oft aufgerufen werden. Solange Promise A im Zustand pending ist, registriert sie jedesmal je einen Handler in den fulfilled und rejected Listen ihres Promises.

Wichtig: Für jeden Aufruf von then wird ein neues Promise B erzeugt!

Sobald der Zustand von Promise A festgelegt (settled) ist, werden die Handler der zum Zustand passenden Liste in der Reihenfolge zur Verarbeitung freigegeben, in der sie registriert wurden. Die Verarbeitung geschieht nicht synchron, sondern so, dass für jeden registrierten Handler ein Eintrag in der Microtask-Queue erstellt wird.

Der Rückgabewert des Handlers legt fest, was mit dem zugehörigen Promise B geschieht. Das ist übrigens unabhängig davon, ob es der fulfilled- oder der rejected-Handler ist.

Rückgabe eines primitiven Wertes (auch undefined) oder eines Objekts, das kein Thenable ist
Hinweis: Jedes Promise ist automatisch auch ein Thenable
B wird auf fulfilled festlegt und erhält diesen Wert.
Rückgabe eines Thenables C
B wird auf den Zwischenzustand resolved gesetzt (siehe Einführungstutorial) und folgt nun dem Zustand und dem Wert von C. Sobald C sich festlegt, übernimmt B diesen Zustand und seinen zugehörigen Wert.
Signalisieren eines Fehlers (throw X)
B wird auf den Zustand rejected festgelegt und erhält X als Wert.

An dieser Stelle ist die Definition von Thenable von Bedeutung. Da die Idee von Promises und ihre Verfügbarkeit durch JavaScript-Zusatzbibliotheken älter ist als die Promises in der ECMAScript-Spezifikation, war es essenziell, an dieser Stelle eine Interoperabilität zu verlangen. Es ist der konkreten Implementierung überlassen, auf welche Weise „Promise B“ dem „Thenable C“ folgt. Die allgemeingültige Form ist, dass Promise B auf dem Thenable C einen fulfilled- und einen rejected-Handler zu registriert und sich festlegt, sobald einer der beiden Handler aufgerufen wird.