Was passiert, wenn ein Versprechen abgeschlossen ist, bevor es aufgerufen wird?

8

Sagen wir, ich habe ein Versprechen wie folgt:

%Vor%

Was passiert, wenn das asynchrone Versprechen abgeschlossen wird, bevor ich anrufe? Normalerweise hätte ich nur lange Aufgaben in der Versprechen-Funktion, aber was, wenn es wirklich schnell einmal abgeschlossen wird?

    
ConditionRacer 17.08.2015, 20:55
quelle

4 Antworten

14

Wie erwartet: Callback wird in diesem Fall sofort aufgerufen, wenn der Aufruf dann erfolgt ist, nachdem das Versprechen bereits gelöst wurde.

Es ist einfach zu testen:

%Vor%
    
dfsq 17.08.2015, 20:59
quelle
4

Wie andere bereits erwähnt haben, können Sie Callbacks mit .then hinzufügen, bevor oder nachdem das Versprechen gelöst wurde, und Sie können sogar mehr als einen Callback hinzufügen.

Diese Callbacks werden in der Reihenfolge aufgerufen, in der sie hinzugefügt wurden, aber immer asynchron, nach der aktuellen Drehung der Ereignisschleife. Wenn also das Versprechen bereits gelöst wurde, wenn Sie ein .then hinzufügen, wird Ihr Handler sofort aufgerufen, aber im "asynchronen Sinn".

Die Promises / A + -Spezifikation lautet:

  

[...] onFulfilled und onRejected werden asynchron ausgeführt, nach der Ereignisschleife, in der then aufgerufen wird, und mit einem neuen Stapel.

    
pdenes 17.08.2015 21:15
quelle
3

Ein Versprechen hat einen Status, was bedeutet, dass Sie auch nach der Erfüllung des Versprechens Callbacks mit .then anhängen können, und sie werden aufgerufen, mit dem gleichen Ergebnis, als wäre das Versprechen nach dem Anhängen erfüllt.

Erfüllt ist der Endzustand eines erfolgreichen Versprechens. Das bedeutet, dass Sie in Zukunft mehr Handler an das erfüllte Versprechen anfügen können, indem Sie das Versprechen als Cache für die ursprüngliche Antwort verwenden.

.then () im MDN

  

dann ()

     

Ruft eine der bereitgestellten Funktionen auf, sobald dieses Versprechen erfüllt ist   erfüllt oder abgelehnt. Ein neues Versprechen wird zurückgegeben, dessen Zustand sich entwickelt   abhängig von dieser Zusage und den bereitgestellten Callback-Funktionen.

     

Der entsprechende Callback wird immer aufgerufen, nachdem diese Methode zurückgegeben wurde.   auch wenn dieses Versprechen bereits erfüllt oder abgelehnt wird. Du kannst auch   Rufen Sie die then-Methode mehrmals auf die gleiche Verheißung, und die   Callbacks werden in derselben Reihenfolge aufgerufen, in der sie registriert wurden.

    
Ori Drori 17.08.2015 21:05
quelle
2

Der then Callback wird niemals aufgerufen, bevor das Versprechen resolved ist. Das ist es, was Sie mit "complete" meinen. Wenn eine Zusage jedoch aufgelöst wird, bevor sie von einer Funktion zurückgegeben wird, werden alle weiteren Erfolgsrückrufe, die nach diesem Zeitpunkt verkettet sind, weiterhin ausgeführt. Zum Beispiel

%Vor%     
GPicazo 17.08.2015 21:03
quelle

Tags und Links