js 事件循环机制(eventLoop)

264 阅读1分钟

add_coveradd_cover先上码子:

console.log(11);
 
setTimeout(() => {
  console.log(2);
  Promise.resolve().then(() => {
    console.log(3)
  });
});
 
new Promise((resolve, reject) => {
  console.log(4)
  resolve(5)
}).then((data) => {
  console.log(data);
   
  Promise.resolve().then(() => {
    console.log(6)
  }).then(() => {
    console.log(7)
     
    setTimeout(() => {
      console.log(8)
    }, 0);
  });
})
 
setTimeout(() => {
  console.log(9);
})
 
console.log(10);
 
 // 结果:11、4、10、5、6、7、2、3、9、8

js事件循环、同步异步:
首先,js任务执行的是单线程的,得按顺序来,后续的任务得等排队(任务队列)等着。
但是任务分为同步和异步。当一个任务块代码执行时, 遇到同步任务,就会进入主线程,
遇到异步任务会进入事件表中注册函数,之后将函数移入到事件队列中。
主线程内任务执行完毕,会去事件队列读取异步函数,按照顺序执行异步函数

图源来自juejin.im/post/59e85e…

js事件循环、宏任务微任务:
js事件还可以分为宏任务微任务:macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):
Promise,process.nextTick 当一个宏任务进入主线程:

判断这个任务是同步异步,同步执行
异步宏任务,放在 事件队列 , 异步微任务,放在 事件队列
当主线程任务执行完毕,去事件队列
进入事件队列,判断是微任务还是宏任务,先执行微任务,再执行宏任务