Soweit ich weiß, kann ein Versprechen aufgelöst () oder abgelehnt () werden, aber ich war überrascht, dass der Code im Versprechen weiterhin ausgeführt wird, nachdem eine Lösung oder Ablehnung aufgerufen wurde.
Ich hielt das Auflösen oder Ablehnen für eine asynchrone Version von exit oder return, die jede sofortige Funktionsausführung stoppen würde.
Kann jemand den Gedanken erklären, warum das folgende Beispiel manchmal die console.log nach einem Auflösungsaufruf zeigt:
var call = function() {
return new Promise(function(resolve, reject) {
resolve();
console.log("Doing more stuff, should not be visible after a resolve!");
});
};
call().then(function() {
console.log("resolved");
});
javascript
promise
ecmascript-6
es6-promise
Ludwig van Beethoven
quelle
quelle
resolve()
ist keine JS-Steueranweisung, die sich auf magische Weise auswirken würdereturn
, sondern nur ein Funktionsaufruf, und ja, die Ausführung wird danach fortgesetzt.Antworten:
JavaScript hat das Konzept "Run to Completion" . Sofern kein Fehler ausgelöst wird, wird eine Funktion ausgeführt, bis eine
return
Anweisung oder deren Ende erreicht ist. Anderer Code außerhalb der Funktion kann dies nicht stören (es sei denn, es wird erneut ein Fehler ausgegeben).Wenn Sie
resolve()
Ihre Initialisierungsfunktion beenden möchten , müssen Sie Folgendes voranstellenreturn
:quelle
resolve()
es sich selbst um eine asynchrone Funktion handelt. Wie wir in der anderen (gelöschten) Antwort gesehen haben, glauben einige Leute, dass Anruferesolve
sofort zu Rückrufen führen.resolve
selbst ist nicht asynchron, es ist vollständig synchron. Obwohl ausschließlich die ES6-API verwendet wird, ist nicht erkennbar, ob sie synchron oder asynchron ist.resolve
dazu führen, dass registrierte Rückrufe sofort aufgerufen werden, sodass sie Teil des aktuellen Anrufstapels sind. Das ist nicht wahr, stattdessen werden nur die Rückrufe in die Warteschlange gestellt (und Sie haben Recht, es ist nicht asynchron, aber es macht einfach seine Sache und endet sofort)console.log
Show bei statt statt warum in dieser Reihenfolge erscheint. Bisherresolve
ist es für die Interpretation der Frage unerheblich , was und wie Versprechen sind. Aber natürlich ist es immer noch wichtig, im Zusammenhang mit Versprechungen Bescheid zu wissen. Einer der Gründe, warum ich Ihre Antwort positiv bewertet habe :)Die Rückrufe, die aufgerufen werden, wenn Sie
resolve
ein Versprechen abgeben, müssen von der Spezifikation weiterhin asynchron aufgerufen werden. Dies dient dazu, ein konsistentes Verhalten sicherzustellen, wenn Versprechen für eine Mischung aus synchronen und asynchronen Aktionen verwendet werden.Wenn Sie
resolve
den Rückruf aufrufen, wird er daher in die Warteschlange gestellt und die Funktionsausführung wird sofort mit jedem Code fortgesetzt, der auf denresolve()
Aufruf folgt .Erst wenn die JS-Ereignisschleife wieder gesteuert wird, kann der Rückruf aus der Warteschlange entfernt und tatsächlich aufgerufen werden.
quelle
EnqueueJob
, die von aufgerufen wird.then
.