Notes

JavaScript 中的任务调度

首先,需要明确

任务分类

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

但实际上 setTimeoutPromise 的执行原理却不相同

宏任务 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 是否都完成

于是