Ich denke darüber nach und habe mir Folgendes ausgedacht:
Nehmen wir an, wir haben einen Code wie diesen:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Eine Anfrage kommt herein und die JS-Engine beginnt Schritt für Schritt mit der Ausführung des obigen Codes. Die ersten beiden Anrufe sind Synchronisierungsanrufe. Aber wenn es um setTimeout
Methoden geht, wird es eine asynchrone Ausführung. Aber JS kehrt sofort davon zurück und setzt die Ausführung fort, die als Non-Blocking
oder bezeichnet wird Async
. Und es arbeitet weiter an anderen etc.
Das Ergebnis dieser Ausführung ist das Folgende:
acdb
Im Grunde genommen wurde die zweite setTimeout
zuerst beendet und ihre Rückruffunktion wird früher als die erste ausgeführt, und das ist sinnvoll.
Wir sprechen hier über Single-Threaded-Anwendung. JS Engine führt dies weiterhin aus. Wenn die erste Anforderung nicht abgeschlossen ist, wird die zweite Anforderung nicht ausgeführt. Das Gute ist jedoch, dass es nicht auf das Auflösen von Blockierungsvorgängen wartet setTimeout
, sodass es schneller ist, da es die neuen eingehenden Anforderungen akzeptiert.
Meine Fragen stellen sich jedoch zu folgenden Punkten:
# 1: Wenn es sich um eine Single-Threaded-Anwendung handelt, welcher Mechanismus wird dann verarbeitet, setTimeouts
während die JS-Engine mehr Anforderungen akzeptiert und ausführt? Wie arbeitet der einzelne Thread weiter an anderen Anforderungen? Was funktioniert, setTimeout
während andere Anfragen immer wieder eingehen und ausgeführt werden ?
# 2: Wenn diese setTimeout
Funktionen hinter den Kulissen ausgeführt werden, während weitere Anforderungen eingehen und ausgeführt werden, was führt die asynchrone Ausführung hinter den Kulissen aus? Was ist das für ein Ding, über das wir sprechen EventLoop
?
# 3: Aber sollte nicht die gesamte Methode in die Datei eingefügt werden, EventLoop
damit das Ganze ausgeführt und die Rückrufmethode aufgerufen wird? Folgendes verstehe ich, wenn ich über Rückruffunktionen spreche:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
In diesem Fall weiß die JS Engine jedoch, ob es sich um eine asynchrone Funktion handelt, sodass sie den Rückruf in das EventLoop? Perhaps something like the
Schlüsselwort async` in C # oder in ein Attribut einfügen kann, das angibt, dass die Methode, die JS Engine übernimmt, eine asynchrone Methode ist und sollte entsprechend behandelt werden.
# 4: Aber ein Artikel sagt ganz im Gegensatz zu dem, was ich vermutet habe, wie die Dinge funktionieren könnten:
Die Ereignisschleife ist eine Warteschlange von Rückruffunktionen. Wenn eine asynchrone Funktion ausgeführt wird, wird die Rückruffunktion in die Warteschlange gestellt. Die JavaScript-Engine beginnt erst mit der Verarbeitung der Ereignisschleife, wenn der Code nach Ausführung einer asynchronen Funktion ausgeführt wurde.
# 5: Und es gibt dieses Bild hier, das hilfreich sein könnte, aber die erste Erklärung im Bild sagt genau dasselbe, was in Frage 4 erwähnt wurde:
Meine Frage hier ist also, um einige Klarstellungen zu den oben aufgeführten Punkten zu erhalten?