不要羡慕微任务,做好自己的宏任务,该来的总会来的。
>> 什么是事件循环?
<< 每次读取一个任务,然后执行这个任务,执行完再继续获取下一个,如果暂时没有任务,就暂停执行,等待下一个任务到来;如果在执行任务的过程中有新的任务到达,也不会中断现有任务的执行,而是添加到队列的尾部等待。
while(获取任务()){
执行任务();
}
但是任务队列又分为macro-task(宏任务)与micro-task(微任务),在最新标准中,它们被分别称为task与jobs。
宏任务
- script标签中的代码
- setTimeout(异步回调加入宏任务)
- setInterval
- setImmediate(Node.js)
- IO
- UI 渲染
- MessageChannel
微任务
- process.nextTick
- Promise
- Async/Await(实际就是promise)
- MutationObserver(html5新特性)
await在执行时会返回Promise,在await后面的相当于Promise.then((resolve)=>{resolve()})
while(获取任务()){
执行任务();
微任务队列.forEach(微任务=>{
执行微任务();
});
}
console.log('1')
async function async1() {
await async2()
console.log('2')
}
async function async2() {
console.log('3')
}
async1()
setTimeout(function() {
console.log('4')
}, 0)
new Promise(resolve => {
console.log('5')
resolve()
})
.then(function() {
console.log('6')
})
.then(function() {
console.log('7')
})
console.log('8')
// 1 3 5 8 2 6 7 4
>> 你脑子里出现字节的面试题是什么意思?
<< 可能是曾经没有抓住的机会吧