簡體   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