js先把宏任務(wù)放進宏任務(wù)隊列里春畔,再把微任務(wù)放進微任務(wù)隊列里仗谆,執(zhí)行的時候先執(zhí)行宏任務(wù)隊列里的一個任務(wù)碗啄,再把微任務(wù)隊列里的所有任務(wù)執(zhí)行完畢,再去執(zhí)行宏任務(wù)隊列里的一個任務(wù)悴势,再去把微任務(wù)清空......一直交替進行
1. macroTask(宏任務(wù))
所有同步JS代碼窗宇、setTimeout(),setInterval()的任務(wù)都是宏任務(wù)特纤,它們會被加進Event Queue(宏任務(wù)的事件隊列)
2. microTask(微任務(wù))
所有promise和process.nextTick()都是微任務(wù)军俊,它們也會被加進Event Queue(微任務(wù)的事件隊列)
3. 面試題1
console.log('script start')
setImmediate(()=>{
console.log('setImmediate')
})
setTimeout(()=>{
console.log('setTimeout');
process.nextTick(function() {
console.log('process.nextTick2');
});
})
process.nextTick(function() {
console.log('process.nextTick1');
});
Promise.resolve().then(()=>{
console.log('promise1')
}).then(()=>{
console.log('promise2')
})
console.log('script end')
請問執(zhí)行順序?
若是剛啟動nodejs捧存,則是:
- script start
- script end
- process.nextTick1
- promise1
- promise2
- setTimeout
- process.nextTick2
- setImmediate
若不是剛啟動粪躬,則是:
- script start
- script end
- process.nextTick1
- promise1
- promise2
- setImmediate
- setTimeout
- process.nextTick2
所以,先執(zhí)行宏任務(wù)(所有同步的js代碼)昔穴,再清空微任務(wù)隊列(promise1镰官、promise2),再執(zhí)行宏任務(wù)吗货,由Event Loop的 3. check 可知泳唠,若是剛啟動nodejs,則setTimeout在前宙搬,不然都是set Immediate在前
4. 面試題2
setTimeout(function(){
console.log('1')
});
new Promise(function(resolve){
console.log('2');
}).then(function(){
console.log('3')
});
console.log('4');
2 4 3 1
因為2是同步代碼