举个栗子

好读书,不求甚解

microtasks and macrotasks

Kevalin's Avatar 2019-07-03

在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

参考文件

  1. stackoverflow

本文作者 : Kevalin
本文使用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议
本文链接 : https://kevalin.github.io/2019/07/03/microtasks-and-macrotasks/