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