执行顺序有什么不同吗?
或者事件队列/循环在JavaScript中的工作方式与Dart不同吗?
答案 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
。它最终将切换到更新的原语(在支持它的浏览器上),允许更精确的超时。