js基础知识——事件轮询
一、什么是事件轮询
- 事件从开始执行代码开始执行轮询
二、事件轮询的规则
- 从 Js 整体代码开始(这是一个宏任务)
- 每执行完毕一个宏任务,就会清空一次微任务队列(不管微任务队列里有多少任务,都执行完毕)
- 再次执行下一个宏任务.
- 循环往复,直到有的任务队列清空结束
三、关键字
- 单线程: JS 是一个单线程的代码执行机制,逐行向下执行,上边的代码执行时向过长会阻塞下边的代码
- 调用栈:用来执行代码的,所有的代码进栈执行,执行完毕再出栈 (后进先出)
- 队列: 用来存放异步任务的,先进先出 宏任务队列: JS 整体代码,setTimeout,setInterval... 微任务队列: promise.then()...
- 轮询: 轮流询问宏任务与 微任务队列的任务来执行
- 注意: WEBApi,用来负责提供异步机制,计时,分配任务去指定队列
最关键每执行完毕一个宏任务,会清空一次微任务队列(前要分清什么是同步任务,什么是宏任务,什么是微任务)
console.log(1); // 同步代码 直接打印 1
setTimeout(() => {
console.log(2); //定时器 宏任务 等待 (第三轮 因为微任务执行完毕,所以执行宏任务 打印2)
}, 0);
new Promise((resolve) => {
console.log(3); // 同步代码 直接打印 3
resolve();
}).then(() => {
console.log(4); //promise.then() 微任务等待 (第二轮 执行微任务 所以直接打印4)
});
setTimeout(() => { //定时器因为有500ms的计时,所以最后执行 是一个宏任务 等待执行(第三轮 代码段 进行拆分)
console.log(5); //最后一轮 :同步代码 直接打印 5
new Promise((resolve) => {
console.log(6); //最后一轮 同步代码 直接执行 打印 6
setTimeout(() => {
console.log(7); //最后一轮 宏任务(先执行微任务)最最最后执行这个 打印7
});
resolve();
}).then(() => {
console.log(8); // 最后一轮 微任务 其他任务执行完毕 会先执行微任务,再执行宏任务,所以先打印 8
});
}, 500);
new Promise((resolve) => {
console.log(9); //同步代码 直接执行 9
resolve();
}).then(() => {
console.log(10); //promise.then() 微任务等待执行 (第二轮 执行微任务 所以直接打印10)
setTimeout(() => { //定时器 宏任务 等待执行 (第三轮 因为44行计时器有500ms 所以 先打印这行 打印11)
console.log(11);
}, 0);
});
console.log(12); //同步代码 直接打印 12
// 第一轮执行打印: 1 3 9 12
// js整体代码是一个宏任务,所以执行完毕会执行微任务 所以第二轮打印 4 10 2 11
// 执行500ms定时器的内容:5 6 8 7