Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。
开局一张图
规范
先同步后异步,异步包含宏任务队列以及微任务队列,在异步队列中执行规范为,先微任务后宏任务
代码示例
// 同步任务
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