Tasks, microtasks, queues and schedules
用一句话概括,就是一个 macrotask 中出现的 mircotask 都在这一次 eventloop 中执行,出现的 macrotask 需要在新的 eventloop 执行
macrotask(task)
- setTimeout = setInterval
- setImmediate
- requestAnimationFrame
- I/O
- UI rendering
microtask
- process.nextTick
- promise callback
例子:
|
|
1 2 3 4 5 |
script start script end promise1 promise2 setTimeout |
- 一次 event loop
- setTimeout 的回调进入 macrotask 栈
- 带 promise1 的回调进入 microtask 栈
- 执行 3 的回调
- 带 promise2 的回调进入 microtask 栈
- 执行 5 的回调
- primise2 出栈
- promise1 出栈
- 没有 microtask 任务了
- 新一次 event loop
- 执行 2 的 macrotask