Problem:
Der folgende Ausschnitt demonstriert die Verwendung von JavaScript verspricht, und die Reihenfolge der Ausführung ist faszinierend.
<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>
Das Ergebnis zeigt, dass die Reihenfolge der Ausführung lautet:
1 2 "A" 3 "B" 7 "C" 4 "B" 8 undefined 9 "D" 5 undefined 10 undefined 6
Es stellt sich die Frage, warum die Ausführungsreihenfolge nicht 1, 2 ist , 3, 4..., und wie unterscheidet sich die Erwartung von 1, 2, 3, 4... vom Ergebnis?
Antwort:
Kommentare:
Das Ausführen von Versprechen innerhalb eines .then()-Handlers, ohne sie vom .then()-Rückruf zurückzugeben, erstellt eine neue, nicht angehängte Versprechensequenz, die in keiner Weise mit den übergeordneten Versprechen synchronisiert wird Weg. Dies wird im Allgemeinen als Fehler betrachtet und einige Promise-Engines geben bei Auftreten Warnungen aus, da es sich normalerweise nicht um das beabsichtigte Verhalten handelt. Ein gültiger Anwendungsfall könnte ein „Fire and Forget“-Vorgang sein, bei dem weder Fehler noch Synchronisierung ein Problem darstellen.
Promise.resolve()-Promises innerhalb von .then()-Handlern erstellen neue Promise-Ketten, die unabhängig vom übergeordneten Element ausgeführt werden Kette. Bei tatsächlichen asynchronen Vorgängen wie AJAX-Aufrufen gibt es kein vorhersehbares Verhalten für unabhängige, getrennte Versprechensketten. Der Zeitpunkt der Fertigstellung ist unbestimmt, etwa so, als würden vier AJAX-Aufrufe parallel gestartet, bei denen die Reihenfolge der Fertigstellung unbekannt ist. Im bereitgestellten Code sind alle Vorgänge synchron, was zu einem konsistenten Verhalten führt. Darauf sollte man sich jedoch nicht verlassen, da der Entwurfszweck von Versprechen die asynchrone Ausführung ist.
Zusammenfassung:
Zeilenweise Analyse:
Fazit:
Das Fehlen einer bestimmten Reihenfolge in Promise.resolve() verspricht Ausführungen innerhalb von .then()-Handlern sowie der Die Unbestimmtheit der .then()-Handlerplanung im Vergleich zu setTimeout() für verschiedene Engines unterstreicht die Bedeutung der Steuerung der Ausführungsreihenfolge durch Verkettung von Versprechen.
Das obige ist der detaillierte Inhalt vonWarum entspricht die Reihenfolge der Promise-Ausführung nicht den Erwartungen in JavaScript?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!