阿孜去面试-事件循环

75 阅读1分钟

不要羡慕微任务,做好自己的宏任务,该来的总会来的。

Blackfeather_Love_Bites_SE.jpg >> 什么是事件循环?

<< 每次读取一个任务,然后执行这个任务,执行完再继续获取下一个,如果暂时没有任务,就暂停执行,等待下一个任务到来;如果在执行任务的过程中有新的任务到达,也不会中断现有任务的执行,而是添加到队列的尾部等待。

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

>> 你脑子里出现字节的面试题是什么意思?

<< 可能是曾经没有抓住的机会吧