Node EventLoop與瀏覽器的區別

前置

Node階段promise

  1. timer: 執行 setTimeout 和 setInterval 回調,由poll階段控制,另外,定時器事件不是準確的,只能是儘快執行
  2. poll: IO回調階段,
    • 若是poll不爲空,遍歷回調隊列同步執行
    • 若是poll爲空,先判斷有沒有setImmediate,有就進入check階段執行,沒有就執行timer,這裏會有個超時控制,防止一直等下去
  3. setImmediate加入check隊列執行

宏任務的執行

setTimeout(() => {
    console.log('timeout 1');
    Promise.resolve().then(() => console.log('promise 1'))
},0)
setTimeout(() => {
    console.log('timeout 2');
    Promise.resolve().then(() => console.log('promise 2'))
},0)
複製代碼

結果瀏覽器

瀏覽器          Node
timeout 1       timeout 1
promise 1       timeout 2
timeout 2       promise 1
promise 2       promise 1
複製代碼

Node在執行宏任務時,會把全部可執行的宏任務一次執行完成(目前12版本好像規範了),瀏覽器老是微任務優先bash

setImmediate和setTimeout 0

setTimeout(function timeout () {
  console.log('timeout');
},0);
setImmediate(function immediate () {
  console.log('immediate');
});
複製代碼

結果oop

瀏覽器          Node
immediate       順序不定
timeout       
複製代碼

Node的setImmediate是在poll階段完成check階段執行的,setTimeout是在pool空閒時執行,由於進入事件循環也須要時間,因此這兩個執行順序不肯定,可是若是像下面這樣ui

const fs = require('fs')
fs.readFile(__filename, () => {
    setTimeout(() => {
        console.log('timeout');
    }, 0)
    setImmediate(() => {
        console.log('immediate')
    })
})
複製代碼

setImmediate會先執行,由於事件是IO回調,也就是poll階段,因此先執行spa

process.nextTick

process.nextTick是獨立於Event Loop,天生比timer和微任務先執行code

相關文章
相關標籤/搜索