Node階段promise
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
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是獨立於Event Loop,天生比timer和微任務先執行code