Okay, lasst uns diese ganze setTimeout-Sache mit 0 ms aufschlüsseln. Auf den ersten Blick würde man denken: „Bro, 0 ms bedeutet, dass es sofort ausgeführt wird, oder?“ Aber JavaScript hat seine eigene Ausstrahlung und 0 ms ist nicht so augenblicklich, wie man es erwarten würde. Lassen Sie uns das gemeinsam herausfinden.
Hier ist der Code, den wir analysieren:
const promise = new Promise((resolve, reject) => { console.log(1); setTimeout(() => { console.log("timerStart"); resolve("success"); console.log("timerEnd"); }, 0); console.log(2); }); promise.then((res) => { console.log(res); }) console.log(4);
Und die Ausgabe?
1 2 4 timerStart success timerEnd
Wenn Sie setTimeout(() => { ... }, 0) sehen, hat es das Gefühl, dass der darin enthaltene Code sofort nach 0 ms ausgeführt wird. Aber nein, JavaScript sagt: „Bruder, ich habe mein eigenes System, warte, bis du dran bist!“
JavaScript führt Code nicht nur direkt aus – es verfügt über ein cooles System namens Ereignisschleife zur Verarbeitung von Aufgaben. Stellen Sie sich das so vor:
Hauptaufgaben (synchron):
Dinge wie console.log() werden zuerst ausgeführt. Dies sind die direkten, direkten Aufgaben.
Mikroaufgaben (Versprechen):
Als nächstes kommen Versprechen, noch vor den Timern. Es ist, als hätten sie ein VIP-Ticket.
Aufgabenwarteschlange (Timer wie setTimeout):
Timer rücken in die hintere Reihe und laufen erst, nachdem die Mikroaufgaben erledigt sind. Selbst wenn Sie ihm 0 ms geben, wartet es.
Lassen Sie uns Schritt für Schritt sehen, was passiert:
Versprechen erstellt:
Promise .then():
console.log(4):
Microtask Runs (VIP):
Aufgabenwarteschlangenläufe:
Auch wenn Sie 0 ms angegeben haben, wird setTimeout immer verzögert. JavaScript schiebt es in die Aufgabenwarteschlange, egal was passiert. Das System löscht zunächst alle synchronen Aufgaben und Mikroaufgaben (Versprechen), bevor es die Aufgabenwarteschlange berührt.
Also, in einfachen Worten:
Bei 0 ms geht es nicht um die Zeit – es geht darum, darauf zu warten, bis man an der Reihe ist.
Stellen Sie sich vor, Sie stehen in der Warteschlange für eine Achterbahnfahrt:
Hier ist die Reihenfolge der Ereignisse in unserem Code:
Wenn Sie verstehen, wie 0 ms wirklich funktionieren, können Sie besseren asynchronen Code schreiben. Es ist auch ein cooler Trick, ihn Ihren Freunden zu erklären, wenn sie zufällige Verzögerungen in ihrem JavaScript beheben.
Wenn Sie also das nächste Mal setTimeout(() => { ... }, 0) sehen, denken Sie daran – es geht nicht um die Zeit; Es geht um Priorität!
Das obige ist der detaillierte Inhalt vonWas bedeutet setTimeout(..., ) in JavaScript wirklich? (Ereignisschleife erklärt!). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!