実行順序に違いはありますか?
または、イベント キュー/ループは、JavaScript では Dart とは異なる動作をしますか?
DOM イベントは Blink によって処理されます。したがって、これらのイベントは同じ方法で処理する必要があります。JavaScript には、他のイベント ループはありません (afaik)。たとえば、実行を譲る一般的なパターンは次のとおりですwindow.setTimeout(0, continuation)
。
Dart には、 によって処理される非同期イベントもありますdart:async
。そこで、インスタントとサイクルを区別できます。インスタントは、1 つ以上のサイクルで構成されます。インスタントは、残りがなくなるまですべてのサイクルを実行し、次のインスタントに移動します。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
実行のための最小限のスリープ時間がありません。JavaScriptwindow.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
. 最終的には、より正確なタイムアウトを可能にする新しいプリミティブ (それをサポートするブラウザー上) に切り替わります。