繁体   English   中英

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

[英]In Dart, how does the event queue/event loop differ between Dart2JS and the Dart VM?

执行顺序有什么不同吗?

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

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 它最终将切换到更新的原语(在支持它的浏览器上),允许更精确的超时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM