【问题标题】:In Dart, how does the event queue/event loop differ between Dart2JS and the Dart VM?在 Dart 中,Dart2JS 和 Dart VM 之间的事件队列/事件循环有何不同?
【发布时间】:2013-04-14 02:22:36
【问题描述】:

执行顺序有什么不同吗?

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

【问题讨论】:

  • 不是一个明确的答案,但无论如何它可能会有所帮助:dart2js 旨在保持行为一致,因此它的工作方式根本不应该有所不同。但是,错误发生了。

标签: dart dart2js


【解决方案1】:

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

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

runAsync 排队一个新的周期。 Timer.run 排队一个新的瞬间。

Futures 和 Streams 使用循环来对可以立即执行的事件进行排队。在下面的示例中,thens 都将在同一时刻安排,因此在任何 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。它最终会切换到更新的原语(在支持它的浏览器上),以允许更精确的超时。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2021-01-16
  • 2022-01-23
  • 2021-03-24
  • 2014-01-21
  • 2022-10-06
  • 1970-01-01
相关资源
最近更新 更多