事件轮询
- 时间: 从开始执行代码开始执行轮询
- 规则:
- => 从 JS 整体代码开始(这是一个宏任务)
- => 每执行完毕一个宏任务, 就会清空一次微任务队列(不管微任务队列里有多少任务, 都执行完毕)
- => 再次执行下一个宏任务
- => 循环往复, 直到所有的任务队列清空结束
- 关键字:
-
- 单线程: JS 是一个单线程的代码执行机制, 逐行向下执行, 上边的代码执行时间过长会阻塞下边的代码
-
- 调用栈: 用来执行代码的, 所有的代码进栈执行, 执行完毕再出栈 (后进先出)
-
- 队列: 用来存放异步任务的, 先进先出
- => 宏任务队列: JS 整体代码, setTimeout, setInterval...
- => 微任务队列: promise.then()...
-
- 轮询: 轮流询问 宏任务 与 微任务队列的任务来执行
-
- 注意: WEBApi, 用来负责提供异步机制, 计时, 分配任务去指定队列
- 最关键的一句话: 每执行完毕一个宏任务, 会清空一次微任务队列 (前提是你要区分清楚什么是同步任务, 什么是宏任务, 什么是微任务)
console.log(1);
setTimeout(() => {
console.log(2);
}, 0);
new Promise((resolve) => {
console.log(3);
resolve();
}).then(() => {
console.log(4);
});
setTimeout(() => {
console.log(5);
new Promise((resolve) => {
console.log(6);
setTimeout(() => {
console.log(7);
});
resolve();
}).then(() => {
console.log(8);
});
}, 500);
new Promise((resolve) => {
console.log(9);
resolve();
}).then(() => {
console.log(10);
setTimeout(() => {
console.log(11);
}, 0);
});
console.log(12);