任务队列(微任务和宏任务)

519 阅读1分钟

Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。

开局一张图

image.png

规范

 先同步后异步,异步包含宏任务队列以及微任务队列,在异步队列中执行规范为,先微任务后宏任务

代码示例

// 同步任务
console.log(1);
// 宏任务
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);

答案:1、4、10、5、6、7、2、3、9、8

理解:

  • 1、打印1 和 10 就不用说啥了
  • 2、new Promise 本身是同步的 then方法和catch方法是异步的 所以前三个打印 1、4、10
  • 3、执行的时候 第一个 setTimeout第二个 setTimeout放入队列。
  • 4、10打印后会执行 new Promise 的回调 resolve 打印 .then 打印 5
  • 5、数字 5 打印完 又产生了 同步任务 Promise 所以继续 打印 6
  • 6、数字 6 打印完 产生了 微任务 执行 Promise 的回调 打印 7
  • 7、数字 7 打印完 产生了 宏任务 放入末尾执行队列。
  • 8、此时 new Promise 的已经执行完了,开始执行第一个 setTimeout ,打印 2 【同步任务】, Promise 随之调用打印 3
  • 9、开始执行第二个 setTimeout 打印 9
  • 10、不要忘了执行new Promise的时候 还放入 执行队列末尾一个宏任务 8

所以最后打印 1、4、10、5、6、7、2、3、9、8