首先,需要明确
在编写 JavaScript 代码时,我们可以自己创建异步执行的代码块,如使用 setTimeout
, Promise
但实际上 setTimeout
与 Promise
的执行原理却不相同
由 setTimeout
发起的异步任务,归类为宏任务
由 Promise
发起的异步任务,归类为微任务,微任务总是会在一个宏任务中
Promise
创建一个异步任务时,这是一个微任务 A1, 由于是在 A 中创建的微任务,因此 A1 是从属于宏任务 A, 当我们再使用 Promise
创建一个异步微任务 A2, 那此时,A 中包含了 A1, A2setTimeout
创建一个异步任务时,这是另一个宏任务,称作 B。若在 B 中我们使用了 Promise
创建了一个微任务 B1(即在 setTimeout
的回调中创建), 那么微任务 B1 就从属于宏任务 B, 即此时,B 中包含了 B1上面的过程,我们就有了两个宏任务 A, B, 其中每个宏任务又包含了各自的微任务,A(A1, A2), B(B1)
而要执行宏任务 B, 实际上,需要等待宏任务 A 完成,而宏任务 A 的完成,又需要等待其微任务们的完成,于是上面的执行顺序依赖为
B -> B1 // 宏任务 B 的完成要依赖 B1 是否完成
B -> A // 宏任务 B 是否能开始,需要依赖宏任务 A 是否结束
A -> (A1, A2) // 宏任务 A 是否完成,需要依赖 A1, A2 是否都完成
于是