Notes

JavaScript 中的任务调度

首先,需要明确

任务分类

在编写 JavaScript 代码时,我们可以自己创建异步执行的代码块,如使用 setTimeout, Promise

但实际上 setTimeout 与 Promise 的执行原理却不相同

宏任务 macrotasks

由 setTimeout 发起的异步任务,归类为宏任务

微任务 microtasks

由 Promise 发起的异步任务,归类为微任务,微任务总是会在一个宏任务中

执行过程

上面的过程,我们就有了两个宏任务 A, B, 其中每个宏任务又包含了各自的微任务,A(A1, A2), B(B1)

而要执行宏任务 B, 实际上,需要等待宏任务 A 完成,而宏任务 A 的完成,又需要等待其微任务们的完成,于是上面的执行顺序依赖为

B -> B1 // 宏任务 B 的完成要依赖 B1 是否完成
B -> A // 宏任务 B 是否能开始,需要依赖宏任务 A 是否结束
A -> (A1, A2) // 宏任务 A 是否完成,需要依赖 A1, A2 是否都完成

于是