在event loop中经常会提到2个task queue,一个是microtasks,另一个是macrotasks,它们之间有什么不同呢?
每一次事件循环,都会先执行macrotask queue的任务,此queue在[ WHATWG specification]中被简单的叫做task queue。当这个macrotask被执行完之后,就会执行这个事件循环中的所有可以执行microtasks。在处理这些microtasks时,他们可以排队更多microtasks,这些microtasks都将逐个运行,直到microtasks队列耗尽。
What are the practical consequences of this?
如果一个microtask中递归了其他的microtasks,可能会花费很长的时间才会去执行macrotask。这意味着,你可能会终止一些UI操作,或者是完成了I/O操作之后不在处理别的任务。
在Node.js中,process.nextTick(属于microtasks)提供了一个内部保护机制process.maxTickDepth来防止出现这样的阻塞。process.maxTickDepth的默认值是1000,当达到这个限制值时就会停止执行下面的microtasks,而来继续执行下面的macrotask。
So when to use what?
一般情况下,当你要在同步中使用异步操作时会用microtasks,也就说是要在执行完同步代码后,在最近的将来就执行这个异步任务。其他的情况,就请使用macrotasks吧。
Examples
macrotasks
- setTimeout
- setInterval
- setImmediate
- requestAnimationFrame
- I/O
- UI rendering
microtasks
- process.nextTick
- Promises
- Object.observe
- MutationObserver