3

実行順序に違いはありますか?

または、イベント キュー/ループは、JavaScript では Dart とは異なる動作をしますか?

4

1 に答える 1

4

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. 最終的には、より正確なタイムアウトを可能にする新しいプリミティブ (それをサポートするブラウザー上) に切り替わります。

于 2013-05-03T22:54:27.707 に答える