浏览器: 链接:https://www.jianshu.com/p/b221e6e36dcb
while (true) {
主线程中的同步任务();
宏任务队列.shift();
微任务队列全部任务();
}
不相同啊: 链接:https://juejin.im/post/5c394da4518825253661bd4d
event loop 的概念。
- Javascript是单线程的,所有的同步任务都会在主线程中执行。
- 主线程之外,还有一个任务队列。每当一个异步任务有结果了,就往任务队列里塞一个事件。
- 当主线程中的任务,都执行完之后,系统会 “依次” 读取任务队列里的事件。与之相对应的异步任务进入主线程,开始执行。
- 异步任务之间,会存在差异,所以它们执行的优先级也会有区别。大致分为 微任务(micro task,如:Promise、MutaionObserver等)和宏任务(macro task,如:setTimeout、setInterval、I/O等)。同一次事件循环中,微任务永远在宏任务之前执行。
- 主线程会不断重复上面的步骤,直到执行完所有任务。
node环境:
while (true) {
loop.forEach((阶段) => {
阶段全部任务(); // 当前循环的某类宏任务
nextTick全部任务();
microTask全部任务();
});
loop = loop.next;
}
循环之前
在进入第一次循环之前,会先进行如下操作:
- 同步任务;
- 发出异步请求;
- 规划定时器生效的时间;
- 执行
process.nextTick()
。
开始循环
循环中进行的操作:
- 清空当前循环内的 Timers Queue,清空 NextTick Queue,清空 Microtask Queue;
- 清空当前循环内的 I/O Queue,清空 NextTick Queue,清空 Microtask Queue;
- 清空当前循环内的 Check Queue,清空 NextTick Queue,清空 Microtask Queue;
- 清空当前循环内的 Close Queue,清空 NextTick Queue,清空 Microtask Queue;
- 进入下轮循环。
可以看出,nextTick 优先级比 Promise 等 microTask 高,setTimeout
和setInterval
优先级比setImmediate
高。
链接:https://www.jianshu.com/p/b221e6e36dcb