Heim > Artikel > Web-Frontend > JS-Ereignisabfragemechanismus erklärt
JS ist eine Single-Thread-Sprache. Ich hoffe, dass dieser Artikel Ihnen helfen kann.
1. Bestimmen Sie zunächst, ob JS synchron oder asynchron ist. Wenn es synchron ist, wird es in den Hauptprozess eingegeben die Ereignistabelle
2. Asynchron Die Aufgabe registriert eine Funktion in der Ereignistabelle. Wenn die Triggerbedingung erfüllt ist, wird sie in die Ereigniswarteschlange verschoben
3 Nach dem Eintritt in den Hauptthread wird nicht überprüft, ob ausführbare asynchrone Aufgaben vorhanden sind.
1 . Führen Sie eine Makroaufgabe aus, wenn während des Prozesses eine Mikroaufgabe auftritt. Legen Sie sie in die [Ereigniswarteschlange] der Mikroaufgabe.
2. Nachdem die aktuelle Makroaufgabe ausgeführt wurde, wird die [Ereigniswarteschlange] der Mikroaufgabe angezeigt Mikrotask wird angezeigt und alle darin enthaltenen Mikrotasks werden nacheinander ausgeführt
1.macro-task (Makroaufgabe): script, setTimeout, setInterval
2. Mikroaufgabe (Mikroaufgabe): Promise, process.nextTick
Wir beginnen mit einer kleinen Frage
for (var i=0;i<=5;i++){ setTimeout(()=>{console.log(i)},1000) }
Das Ausgabeergebnis sollte 6 aufeinanderfolgende 6er sein, die nach 1 gedruckt werden Zweitens ist der Hauptwissenspunkt dieser Frage der Bereich auf Blockebene, sie eignet sich jedoch sehr gut für die Einführung eines Ereignisabfragemechanismus. Da es sich bei setTimeout um eine asynchrone Aufgabe handelt, muss sie nicht sofort ausgeführt werden, bis die for-Schleife endet. Wenn i 6 wird, werden 6 Timer gleichzeitig ausgeführt Zeit, i zeigt auf den globalen Wert von 6. Variable, also drucke 6, das ist der JS-Ausführungsmechanismus (1)
Um es schwieriger zu machen, betrachte den JS-Ausführungsmechanismus (2)
// promise里面的函数是立即执行的// 分别输出 2 3 5 4 1setTimeout(function () { console.log(1) },0);new Promise(function executor(resolve) { console.log(2); for(var i=0;i<10000;i++){ i==9999 && resolve(); } console.log(3); }).then(function () { console.log(4); }); console.log(5);
Die erste auszuführende Makroaufgabe muss das Skript (Skript) sein, daher wird der Timer übersprungen (unabhängig davon, wie viele Sekunden Sie die Ausführung verzögern) und dann den Inhalt im Versprechen ausführen, um ihn zu drucken 2 Führen Sie zuerst eine for-Schleife aus und lösen Sie () ist eine asynchrone Rückruffunktion, die zum Inhalt der asynchronen Ausführung gehört. Wie wir in der Aufgabenteilung erwähnt haben, gehört Promise zur Mikrotask, sodass die Mikrotask-Ereigniswarteschlange anschließend gelöscht wird Die Makroaufgabe endet, daher werden als nächstes 3, 5 und 4 gedruckt.
Zu diesem Zeitpunkt ist die erste Makroaufgabe abgearbeitet und dann ist der Timer an der Reihe.
Das obige ist der detaillierte Inhalt vonJS-Ereignisabfragemechanismus erklärt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!