Ich habe zwei async
-Funktionen. Beide warten auf zwei 3 Sekunden Funktionsaufrufe. Aber der zweite ist schneller als der erste. Ich denke, der schnellere läuft parallel und der andere seriell. Ist meine Annahme richtig? Wenn ja, warum passiert das, da beide Funktionen logisch gleich aussehen?
Frxstream hat bereits eine ausgezeichnete Antwort . Darauf aufbauen und eine Perspektive bieten:
Das erste, was zu erkennen ist, ist, dass Versprechen "heiß" erstellt werden - das heißt, wenn Sie ein Versprechen-Objekt haben, ist es bereits "in Bearbeitung".
Das zweite wichtige Konzept ist, dass await
wie eine "asynchrone Wartezeit" ist - das heißt, es unterbricht die Ausführung der Funktion, bis diese Zusage abgeschlossen ist.
Also ruft die serial
-Funktion sleep
auf, erhält ein Versprechen zurück und wartet dann (asynchron) darauf, dass dieses Versprechen abgeschlossen wird. Nachdem das Versprechen 3 Sekunden später abgeschlossen wurde, ruft serial
erneut sleep
auf, erhält ein Versprechen zurück und wartet dann (asynchron) darauf, dass dieses Versprechen abgeschlossen wird. Nachdem dieses Versprechen 3 Sekunden später abgeschlossen wurde, wird serial
abgeschlossen.
Die Funktion parallel
ruft sleep
auf und speichert ihr Versprechen in a
, ruft dann sleep
auf und speichert ihr Versprechen in b
und wartet dann (asynchron) auf den Abschluss von a
. Nachdem a
3 Sekunden später abgeschlossen wurde, wartet parallel
(asynchron) auf die Ausführung von b
. Nachdem b
praktisch sofort abgeschlossen wurde, wird parallel
abgeschlossen.
Es ist klarer, wenn Sie Ihre Funktion serial
wie folgt schreiben:
Hier können Sie deutlich sehen, dass in der Funktion serial
der zweite sleep()
nur aufgerufen wird, nachdem der erste sleep()
abgeschlossen wurde, während er in parallel
sofort aufgerufen wird, bevor der erste abgeschlossen ist Es wartet auf beide, um abzuschließen. Obwohl sie funktionell identisch aussehen, sind sie subtil verschieden.
Da die sleep()
-Funktion eine synchrone Funktion ist, gibt sie nur eine asynchrone Versprechung zurück, zB:
In parallel()
, die beiden sleep()
synchronisieren zwei Versprechen, sie warten auf ihre Auflösung, es wird ungefähr 3s dauern.
In serial()
bedeuten die beiden await sleep()
jedoch, dass die zweite sleep()
-Versprechung warten muss, bis die erste sleep()
aufgelöst wurde, also werden es ungefähr 6s sein.
Tags und Links javascript async-await ecmascript-2017