微任务与事件以及如何定义什么是什么?

Fal*_*per 5 dart

我在他们的网站上阅读了 dart 的事件循环理解:

https://www.dartlang.org/articles/event-loop

但我似乎很困惑。我理解主要项目的顺序,然后是微观,然后是事件,但我真正感到困惑的是实际实现。

与事件相比,微任务的真正定义是什么,它们可以互换吗?

在此处输入图片说明

看完这张图表,以及一些显示事物打印顺序的例子后,我很好奇是什么让它们与众不同?似乎两者都可以是代码块,但区别在于重要性的级别......有点像:正常,提升和关键......

在一个示例中,程序运行但有一个关键的字符输入,因为它需要立即反馈,然后是事件,这些组件在适当的时间完成,但不是关键的,需要从当前正在运行的程序(思考,类似于创建一个独立执行的新线程,并在完成时返回一些数据,或执行一些代码)。

如果有人能更清楚地阐明这两个元素之间的差异,那就太棒了。

lrn*_*lrn 6

事件和微任务之间的区别基本上是优先级之一。如果有一个预定的微任务,它总是在下一个预定事件之前运行。当微任务队列为空并且存在未决事件时,将运行事件。在许多情况下,这是唯一的区别 - 您可以使用计时器或微任务来安排某些事情,并且微任务只会在其他微任务之前进行。

看待同一件事的另一种方式是,微任务始终属于单个事件,即最近的一个事件,它调度了微任务(直接或通过其他微任务),并且它自己调度的所有微任务都属于同一个事件。

在浏览器中,还有一个区别——微任务在下一页重排之前运行。这就像页面重排是由其他事件之间的事件循环运行的非 Dart 事件。如果您在一系列微任务中执行一堆页面 DOM 更新,则它们都将在页面更新之前完成。如果您在连续事件中执行它们,页面将在更改之间更新,这并不总是您想要的。

一些浏览器操作提供仅在当前事件期间有效的资源(例如,数据库连接)。这就是将微任务视为前一事件的一部分很重要的地方——资源在接下来的微任务中仍然有效。这是开始引入微任务的原因之一。

由于微任务抢占事件,这意味着运行一个无限的微任务链会使浏览器饿死并且永远不会更新页面,所以如果你想做大量的计算并在此过程中更新页面(比如进度条),你需要经常返回事件循环以保持页面响应。

您可以将 对 的初始调用main视为一个事件,微任务将在它完成后运行,在任何其他事件之前运行。