Microtasks vs Events以及如何定义哪些内容?

时间:2016-01-12 20:38:37

标签: dart

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

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

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

什么才能真正定义一个Microtask而不是一个事件,它们可以互换吗?

enter image description here

在查看此图表以及一些显示打印输出顺序的示例后,我很好奇是什么让它们与众不同?似乎两者都可以是代码块,但区别在于重要性......有点像:正常,高架和严重......

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

您可以将对var image = new Image(); image.src = 'http://some.file/that/does/not-exist.jpg'; var sourceLoad = Rx.Observable.fromEvent(image, 'load'); var sourceError = Rx.Observable.fromEvent(image, 'error'); sourceLoad.subscribe( function(e) { console.log('loaded'); }/*, function(e) { console.log('Handling errors here is not working. Why?') } */ ); sourceError.subscribe( function(e) { console.log('error'); } ); 的初始调用视为一个事件,并且在任何其他事件发生之前,微任务将在完成之后运行。

答案 1 :(得分:2)

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

A great article更详细地解释了@lrn在浏览器中写的关于任务和微任务的内容。