Heim  >  Artikel  >  Web-Frontend  >  Warum ist die Ausführungsreihenfolge von JavaScript Promise nicht wie erwartet linear?

Warum ist die Ausführungsreihenfolge von JavaScript Promise nicht wie erwartet linear?

DDD
DDDOriginal
2024-10-24 13:23:31502Durchsuche

Why is the JavaScript Promise execution order not linear as expected?

JavaScript Promise-Ausführungsreihenfolge

Problem

Betrachten Sie den folgenden JavaScript-Code, der Versprechen verwendet:

<code class="javascript">Promise.resolve('A')
  .then(function(a){console.log(2, a); return 'B';})
  .then(function(a){
     Promise.resolve('C')
       .then(function(a){console.log(7, a);})
       .then(function(a){console.log(8, a);});
     console.log(3, a);
     return a;})
  .then(function(a){
     Promise.resolve('D')
       .then(function(a){console.log(9, a);})
       .then(function(a){console.log(10, a);});
     console.log(4, a);})
  .then(function(a){
     console.log(5, a);});
console.log(1);
setTimeout(function(){console.log(6)},0);</code>

Die Ausgabe lautet wie folgt:

<code class="text">1
2 "A"
3 "B"
7 "C"
4 "B"
8 undefined
9 "D"
5 undefined
10 undefined
6</code>

Die Frage betrifft die Ausführungsreihenfolge, insbesondere die Zahlen 1, 2, 3, 7 usw. Warum ist es nicht die erwartete lineare Reihenfolge 1, 2, 3, 4, ...?

Antwort

Ausführungsreihenfolge versprechen

JavaScript-Versprechen folgen bestimmten Ausführungsregeln:

  1. Asynchrone Ausführung: Promise .then()-Handler werden asynchron ausgeführt, nachdem der aktuelle Ausführungsthread beendet ist. Dadurch soll sichergestellt werden, dass asynchrone Vorgänge abgeschlossen werden können, ohne den Hauptthread zu blockieren.
  2. Verschachtelte Versprechen: Durch das Erstellen neuer Versprechen innerhalb von .then()-Handlern ohne deren Rückgabe werden unabhängige Versprechenketten erstellt. Diese unabhängigen Versprechensketten haben keine vorhersehbare Ausführungsreihenfolge.

Auftragsanalyse

Im angegebenen Code:

  • Das anfängliche Versprechen wird sofort aufgelöst, also Sein .then()-Handler (console.log(2, a)) wird asynchron nach console.log(1) (Zeile 23) ausgeführt.
  • Der .then()-Handler in Zeile 4 erstellt eine unabhängige Promise-Kette das asynchron läuft.
  • Der .then()-Handler in Zeile 12 erstellt eine weitere unabhängige Versprechenskette, die asynchron läuft.
  • Der .then()-Handler in Zeile 19 erstellt noch eine weitere unabhängige Versprechenskette, die wird asynchron ausgeführt.
  • setTimeout() legt einen Rückruf fest, der ausgeführt wird, nachdem der aktuelle Ausführungsthread beendet ist, es kann jedoch nicht garantiert werden, dass er vor oder nach Promise .then()-Handlern ausgeführt wird.

Nichtdeterministische Ausführung

Da die in .then()-Handlern erstellten unabhängigen Versprechensketten keine vorhersehbare Ausführungsreihenfolge haben, hängt die Reihenfolge von 3, 7, 4, 8, 9, 5, 10 davon ab Spezifische Promise-Engine-Implementierung.

Empfehlungen

Um eine bestimmte Ausführungsreihenfolge für asynchrone Vorgänge sicherzustellen, wird Folgendes empfohlen:

  1. Vermeiden Sie die Erstellung unabhängiger Promise-Ketten innerhalb von .then ()-Handler.
  2. Verknüpfen Sie Promise-Ketten, um eine bestimmte Ausführungsreihenfolge sicherzustellen.

Im gegebenen Beispiel wird das Promise.resolve('C')-Promise aus dem .then( zurückgegeben )-Handler in Zeile 4 würde die Versprechensketten verknüpfen und zur erwarteten sequentiellen Ausführungsreihenfolge führen.

Das obige ist der detaillierte Inhalt vonWarum ist die Ausführungsreihenfolge von JavaScript Promise nicht wie erwartet linear?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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