Olay döngüsünü yığından ayrı olarak tartışamayız, bu yüzden:
JS'de üç "yığın" vardır:
- tüm senkron çağrılar için standart yığın (bir fonksiyon diğerini çağırır, vb.)
- daha yüksek önceliğe sahip tüm zaman uyumsuz işlemler için mikro görev kuyruğu (veya iş kuyruğu veya mikro görev yığını) (process.nextTick, Promises, Object.observe, MutationObserver)
- daha düşük önceliğe sahip tüm zaman uyumsuz işlemler için makro görev kuyruğu (veya olay kuyruğu, görev kuyruğu, makro görev kuyruğu) (setTimeout, setInterval, setImmediate, requestAnimationFrame, G / Ç, UI oluşturma)
|=======|
| macro |
| [...] |
| |
|=======|
| micro |
| [...] |
| |
|=======|
| stack |
| [...] |
| |
|=======|
Ve olay döngüsü şu şekilde çalışır:
- yığıntan aşağıdan yukarıya doğru her şeyi yürütün ve SADECE yığın boş olduğunda yukarıdaki sıralarda neler olup bittiğini kontrol edin
- mikro yığını kontrol edin ve mikro görev kuyruğu boşalana veya herhangi bir yürütme gerekmeyene kadar bir mikro görev birbiri ardına yığın yardımı ile (gerekirse) orada yürütün ve SADECE makro yığınını kontrol edin
- Makro yığınını kontrol edin ve orada her şeyi (gerekirse) yığın yardımıyla yürütün
Yığın boş değilse Mico yığını dokunulmaz. Mikro yığın boş değilse VEYA herhangi bir yürütme gerektirmiyorsa makro yığını dokunulmaz.
Özetle: mikro görev kuyruğu neredeyse makro görev kuyruğuyla aynıdır, ancak bu görevlerin (process.nextTick, Promises, Object.observe, MutationObserver) makro görevlerden daha yüksek önceliği vardır.
Mikro, makro gibidir ancak daha yüksek önceliğe sahiptir.
Burada her şeyi anlamak için "nihai" kod var.
console.log('stack [1]');
setTimeout(() => console.log("macro [2]"), 0);
setTimeout(() => console.log("macro [3]"), 1);
const p = Promise.resolve();
for(let i = 0; i < 3; i++) p.then(() => {
setTimeout(() => {
console.log('stack [4]')
setTimeout(() => console.log("macro [5]"), 0);
p.then(() => console.log('micro [6]'));
}, 0);
console.log("stack [7]");
});
console.log("macro [8]");
/* Result:
stack [1]
macro [8]
stack [7], stack [7], stack [7]
macro [2]
macro [3]
stack [4]
micro [6]
stack [4]
micro [6]
stack [4]
micro [6]
macro [5], macro [5], macro [5]
--------------------
but in node in versions < 11 (older versions) you will get something different
stack [1]
macro [8]
stack [7], stack [7], stack [7]
macro [2]
macro [3]
stack [4], stack [4], stack [4]
micro [6], micro [6], micro [6]
macro [5], macro [5], macro [5]
more info: https://blog.insiderattack.net/new-changes-to-timers-and-microtasks-from-node-v11-0-0-and-above-68d112743eb3
*/
while (task = todo.shift()) task();