只有一个 event loop ,但任务队列可有多个:

1 | new Promise((resolve, reject) => { |
``
首先将所有代码放入 macrotask queue 中执行:

↑ 将匿名函数放入 microtask queue 中排队等待。

↑ 控制台输出 ‘4’。

↑ 放入 macrotask queue 中排队等待执行。
microtask queue :
1 | microtask1:/* P1.then 中的回调函数 */ |
macrotask queue 任务执行结束,检查 microtask queue ,发现 task1,将 task1 推出执行:

↑ 控制台输出 ‘1’。

↑ 将 P2.then 中的匿名函数放入 microtask queue 中。
microtask queue:
1 | maicrotask2: /* P2.then 中的回调函数 () => console.log(2)*/ |

↑ 放入 macrotask queue 中排队等待执行。
macrotask queue:
1 | macrotask1: () => console.log(5) |
microtask1 执行结束,检查 microtask queue 发现 microtask2,推出执行:

↑ 控制台输出 ‘2’。
#####
microtask2 执行结束,检查 microtask queue ,microtask queue 为空,转而执行 macrotask queue 中的任务:
macrotask1 执行,控制台输出 ‘5’。
macrotask2 执行,控制台输出 ‘3’。
macrotask queue 执行结束,检查 microtask queue, mirotask queue为空,event loop 结束。
最后更新: 2018年09月09日 22:40