Microtasks vs Events 以及如何定义 what as which?

Microtasks vs Events and how to define what as which?

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

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

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

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

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

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

如果有人能更清楚地说明这两个元素之间的区别,那就太好了。

微任务是 sub-tasks 事件。如果你安排微任务,它们会在处理下一个事件之前异步执行。因此,当微任务队列为空时,事件队列中的下一个任务就是进程。 当 main 被处理并且事件队列为空时,应用程序退出。

一个 great article 更详细地解释了@lrn 写的关于任务的内容和 micro-tasks 在浏览器中的内容。

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

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

在浏览器中,还有一个进一步的区别 - 在下一页回流之前的微任务 运行。这就像一个页面回流是一个 non-Dart 事件 运行 通过其他事件之间的事件循环。如果您在一系列微任务中执行一堆页面 DOM 更新,它们将在页面更新之前全部完成。如果您在连续的事件中执行它们,页面将在更改之间更新,这并不总是您想要的。

某些浏览器操作提供的资源(例如,数据库连接)仅在当前 事件 期间有效。这就是微任务被认为是前一个事件的一部分的重要性——资源在后续微任务期间仍然有效。这是开始引入微任务的原因之一。

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

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