在Dart中,Dart2JS和Dart VM之间的事件队列/事件循环如何不同?

时间:2013-04-20 22:27:45

标签: dart dart2js

执行顺序有什么不同吗?

或者事件队列/循环在JavaScript中的工作方式与Dart不同吗?

1 个答案:

答案 0 :(得分:4)

DOM事件由Blink处理。因此,应以相同的方式处理这些事件。在JavaScript中没有其他事件循环(afaik)。例如,产生执行的常见模式是window.setTimeout(0, continuation)

在Dart中,我们还有由dart:async处理的异步事件。我们可以区分瞬间周期。瞬间由一个或多个周期组成。瞬间执行其所有循环,直到没有剩余,然后移动到下一个瞬间。 DOM事件与瞬间处于同一级别。也就是说,DOM事件永远不会与同一时刻的循环交错。 [^ 1](这也意味着在同一时刻内堆积周期会使DOM饿死。)

runAsync排队一个新周期。 Timer.run排队等候。

Futures和Streams使用循环对可以立即执行的事件进行排队。在以下示例中,then将在同一时刻内安排,因此在任何DOM事件有可能发生干扰之前运行。

var future = new Future.value(499);
future.then(print);
future.then(print);

Dart和JavaScript之间存在其他一些小差异:Dart没有Timer次运行的最小睡眠时间。在JavaScript中window.setTimeout不允许在5ms之前执行计算。 (这是由于不幸的历史情况)。 Dart没有这个限制。 [^ 2]

VM的Timer功能不基于DOM,并且有自己的实现。截至2013年5月,计划的计时器回调的顺序在JavaScript(以及dart2js)和VM之间不一致。 (我不确定Dartium,但我相信它使用DOM的版本,因此类似于JavaScript)。

我们目前正在讨论对库的更改,以保证Timer事件以“正确”的顺序执行,而不仅仅是在等待时间过后。


[^ 1]这未正确实施。截至2013年5月,异步操作建立在Timer之上。

[^ 2]这也没有完成(2013年5月)。我不确定Dartium,但dart2js目前仍然使用window.setTimeout。它最终将切换到更新的原语(在支持它的浏览器上),允许更精确的超时。