例子: (来源:https://juejin.im/post/5b7057b251882561381e69bf#comment
)
setTimeout(function () {
console.log('setTimeout1')
}, 0)
var p1 = new Promise(function (resolve, reject) {
setTimeout(() => { resolve(1) }, 0)
})
setTimeout(function () {
console.log('setTimeout2')
}, 0)
for (var i = 0; i < 3; i++) {
p1.then(function (value) {
console.log('promise then - ' + i)
})
}
浏览器和Node环境下的结果不同
浏览器运行结果:
依次注册了3个macroTask, 3个microTask
执行第一个macroTask后,再执行第二个macroTask,再去执行剩余的所有microTask, 再执行最后一个macroTask
Node 运行结果:
浏览器环境下,microtask的任务队列是每个macrotask执行完之后执行;
在Node.js中(node11之前,node11及之后和浏览器一致),
microtask会在事件循环的各个阶段之间执行,也就是一个阶段执行完毕,就会去执行microtask队列的任务