Nic*_*ght 115 javascript event-loop node.js promise
我刚刚读完了Promises/A +规范并偶然发现了微任务和macrotask这两个术语:请参阅http://promisesaplus.com/#notes
我以前从未听说过这些术语,现在我很好奇它的区别是什么?
我已经尝试在网上找到一些信息,但我发现的所有内容都来自w3.org档案馆(这并不能解释我与众不同之处):http://lists.w3.org/Archives /Public/public-nextweb/2013Jul/0018.html
另外,我发现了一个名为"macrotask"的npm模块:https://www.npmjs.org/package/macrotask 同样,没有明确区别的是什么.
我所知道的是,它与事件循环有关,如https://html.spec.whatwg.org/multipage/webappapis.html#task-queue 和https://html.spec.whatwg中所述. .ORG /多页/ webappapis.html#执行-A-microtask检查点
根据WHATWG规范,我知道理论上我应该能够自己提取差异.但我确信其他人也可以从专家的简短解释中受益.
Nic*_*ght 180
事件循环的一次复制将从macrotask队列中正好处理一个任务(该队列简称为WHATWG规范中的任务队列).在该宏任务完成之后,将处理所有可用的微任务,即在相同的复飞周期内.在处理这些微任务时,它们可以排队甚至更多的微任务,这些微任务将一个接一个地运行,直到微任务队列耗尽为止.
如果微任务以递归方式排队其他微任务,则可能需要很长时间才能处理下一个宏任务.这意味着,您最终可能会在应用程序中出现阻止的UI或一些已完成的I/O空闲.
然而,至少有关的Node.js的process.nextTick功能(哪些队列microtasks),存在通过process.maxTickDepth的手段对这种阻挡一个内置的保护.这个值被设置为1000默认,砍伐的进一步处理microtasks达到此限制后,允许下一个宏任务要被处理)
基本上,当您需要以同步方式异步执行某些操作时(例如,当您在最近的将来执行此(微)任务时),请使用微任务.否则,坚持使用macrotasks.
macrotasks : setTimeout,setInterval,setImmediate,requestAnimationFrame,I/O,UI呈现
微任务: process.nextTick,Promises,Object.observe,MutationObserver
Jaf*_*ake 74
我写了一篇关于此的帖子,包括互动示例https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/
更新:我还讨论了这个https://www.youtube.com/watch?v=cCOL7MC4Pl0.讨论更详细,包括任务和微任务如何与渲染交互.
use*_*210 53
我认为我们不能脱离堆栈来讨论事件循环,所以:
JS 有三个“栈”:
|=======|
| macro |
| [...] |
| |
|=======|
| micro |
| [...] |
| |
|=======|
| stack |
| [...] |
| |
|=======|
Run Code Online (Sandbox Code Playgroud)
事件循环是这样工作的:
如果堆栈不为空,则不会触及微堆栈。如果微堆栈不为空或不需要任何执行,则不会触及宏堆栈。
总结一下:微任务队列与宏任务队列几乎相同,但这些任务(process.nextTick、Promises、Object.observe、MutationObserver)比宏任务具有更高的优先级。
微观就像宏观,但具有更高的优先级。
在这里,您拥有理解一切的“终极”代码。
|=======|
| macro |
| [...] |
| |
|=======|
| micro |
| [...] |
| |
|=======|
| stack |
| [...] |
| |
|=======|
Run Code Online (Sandbox Code Playgroud)
/* Result:
stack [1]
macro [8]
stack [7], stack [7], stack [7]
macro [2]
macro [3]
stack [4]
micro [6]
stack [4]
micro [6]
stack [4]
micro [6]
macro [5], macro [5], macro [5]
--------------------
but in node in versions < 11 (older versions) you will get something different
stack [1]
macro [8]
stack [7], stack [7], stack [7]
macro [2]
macro [3]
stack [4], stack [4], stack [4]
micro [6], micro [6], micro [6]
macro [5], macro [5], macro [5]
more info: https://blog.insiderattack.net/new-changes-to-timers-and-microtasks-from-node-v11-0-0-and-above-68d112743eb3
*/
Run Code Online (Sandbox Code Playgroud)
wen*_*ang 42
当调用堆栈为空时,执行以下步骤 -
Yil*_*maz 13
宏任务包括键盘事件、鼠标事件、定时器事件(setTimeout)、网络事件、Html解析、更改Urletc。宏任务代表一些离散且独立的工作。微任务队列具有较高的优先级,因此宏任务将等待所有微任务先执行。
\n微任务是更新应用程序状态的较小任务,应在浏览器继续执行其他任务(例如重新呈现 UI)之前执行。微任务包括 Promise 回调和 DOM 突变更改。微任务使我们能够在重新渲染 UI 之前执行某些操作,从而避免可能显示不一致的应用程序状态的不必要的 UI 渲染。
\n宏任务和微任务的分离使事件循环能够对任务类型进行优先级排序;例如,优先考虑对绩效敏感的任务。
\n在单次循环迭代中,最多处理一个宏任务(其他任务在队列中等待),而处理所有微任务。
\n\n\n\n\n
\n- \n
两个任务队列都放置在事件循环之外,以指示将任务添加到其匹配队列的操作发生在事件循环之外。否则,在执行 JavaScript 代码时发生的任何事件都将被忽略。检测和添加任务的行为是与事件循环分开完成的。
\n- \n
两种类型的任务一次执行一个。当任务开始执行时,它\xe2\x80\x99 会执行直至完成。只有浏览器可以停止\n任务的执行;例如,如果任务占用过多\n时间或内存。
\n- \n
所有微任务都应该在下一次渲染之前执行,因为它们的目标是在渲染发生之前更新应用程序状态。
\n浏览器通常尝试每秒渲染页面 60 次,\n人们普遍认为每秒 60 帧是动画显得流畅的速率。如果我们想要实现应用程序的平稳运行,单个任务以及该任务生成的所有微任务最好在 16 毫秒内完成。如果任务执行时间超过\n几秒钟,浏览器将显示 \xe2\x80\x9cUnresponsive script\xe2\x80\x9d\n消息。
\n
| 归档时间: |
|
| 查看次数: |
28049 次 |
| 最近记录: |