例子: (來源: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環(huán)境下的結(jié)果不同
瀏覽器運(yùn)行結(jié)果:
依次注冊(cè)了3個(gè)macroTask, 3個(gè)microTask
執(zhí)行第一個(gè)macroTask后,再執(zhí)行第二個(gè)macroTask董济,再去執(zhí)行剩余的所有microTask步清, 再執(zhí)行最后一個(gè)macroTask
Node 運(yùn)行結(jié)果:
瀏覽器環(huán)境下,microtask的任務(wù)隊(duì)列是每個(gè)macrotask執(zhí)行完之后執(zhí)行;
在Node.js中(node11之前虏肾,node11及之后和瀏覽器一致)廓啊,
microtask會(huì)在事件循環(huán)的各個(gè)階段之間執(zhí)行,也就是一個(gè)階段執(zhí)行完畢封豪,就會(huì)去執(zhí)行microtask隊(duì)列的任務(wù)