[译] 事件循环中microtask和macrotask的不同之处

stackoverflow地址: Difference between microtask and macrotask within an event loop context

问:

我刚刚读完了Promises/A+规范,但被microtask 和 macrotask这两个名词给困扰到了: 详情见promisesaplus.com/#notes

我之前从来没听过这些名词,现在我很好奇它们之间到底有什么区别?

我已经尽我所能的在网上搜罗了一些信息,但只找到了w3.org归档中的一篇文章(但里面没有解释俩名词之间的不同点):lists.w3.org/Archives/Pu…

另外,我发现了一个npm模块,名字就叫做"macrotask": www.npmjs.org/package/mac… .但可惜的是,它并没有说清楚不同之处到底是什么.

我所能了解到的只是,它们与事件循环有关,如html.spec.whatwg.org/multipage/w…html.spec.whatwg.org/multipage/w…中所述.

我知道我理论上能通过WHATWG规范凭自己找到它们的不同点.但我确信假如有这方面的专家能给出一个简短的解释,那么其他人肯定也会从中受益良多.

高票回答1:

一轮事件循环将只会精确的执行一个来自macrotask队列的任务(这个队列在[WHATWG 规范]中被简称为task 队列(html.spec.whatwg.org/multipage/w…)).

当该macrotask完成后,所有可用的microtasks都将被执行,即在同一轮循环内.当这些microtasks都被处理完后,它们可能会将更多的microtasks加入到队列中去,这些任务将会依次执行,直到microtask队列为空.

那么这种情况的实际结果到底是什么样呢?

如果一个microtask递归地将其它microtasks加入队列,这将会导致下一个macrotask需要等待很久才能执行.这意味着,你的程序可能会因为一个被阻塞的UI或者一些已完成但空置的I/O被告以结束.

但是,至少Node.js的process.nextTick函数(负责对microtasks进行排队),有一套内建的保护机制,可以通过设置process.maxTickDepth来防止类似的阻塞行为.该值默认为1000,一旦到达该值,那么超出该限制外的一切microtasks处理行为将会被切断,这样就可以处理下一个macrotask了.

所以何时使用它们?

通常,当你需要以同步的方式做一些异步的事情时(i.e. 当你想在一旦完成该(micro-)task就执行某些代码的时候).

否则的话,继续使用macrotasks.

具体分类:
macrotasks: setTimeout, setInterval, setImmediate, I/O, UI 渲染

microtasks: process.nextTick, Promises(注:浏览器原生Promise), Object.observe, MutationObserver

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值