2

これは単なる質問ではなく、Javascriptのタイムアウト機能のサービス品質(QoS)を確保するための要求です。

次の擬似コードを見てください。

  .. start something in JS after a user action
  .. some js code
  setTimeout( function() { doSomething }, 1 );
  .. continue for longer than 1ms doing something
  .. end code for user action

  .. after 

  .. execute doSomething

すべての主要なブラウザーで、コードが最初のユーザーアクションを処理した後に、タイムアウトのコードが実行されることを確認できますか?これは遅延時間とは無関係です。

遅延時間は重要ではなく、「doSomething」コードが後に実行されるという事実です。

0遅延で何が起こりますか?

さまざまなブラウザでの経験に感謝します。

4

1 に答える 1

4

非同期イベントが「発生」する場合は、Javascriptのシングルスレッドの性質により、実際に実行される場合とは異なります。

評価されるコードの各ブロックは、タスクキュー内のタスクとして内部的に表されます。したがって、特定のコードブロックの途中で、非同期イベントが。を介して実行できるように準備されているとしsetTimeout()ます。遅延が十分に短い場合、実際には、同じコードブロックの残りの部分の実行が終了する前に「発火」するのを止めることはできません。setTimeoutただし、「起動」とは、ハンドラーが実際に中断して実行することを意味するものではありません。これは、タスクキューでタスクに変換されたことを意味します。実際の実行は、タスクキューからポップされるまで待機する必要があり、元のコードブロックが終了するまで実行できません。

HTML5仕様のスニペットは次のとおりです。もちろん、すべてのブラウザに対して権限があるわけではありませんが、HTML5であることは、実例です。

http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#processing-model-3

メインイベントループ用にそこで定義されている7つのステップの最初は次のとおりです。

  1. 関連するドキュメントが完全にアクティブではないタスクを無視して、イベントループのタスクキューの1つで最も古いタスクを実行します[...]

この最初のステップはアトミックであることに注意してください。環境がリセットされ、次のタスクが取得される前に、タスクを完了するまで実行する必要があります。

これに関するJohnResigの投稿もご覧ください:http: //ejohn.org/blog/how-javascript-timers-work/

だから、あなたの質問を書きます:

すべての主要なブラウザーで、最初のユーザーアクションを処理するコードの後に​​タイムアウトのコードが実行されることを確認できますか?これは、遅延時間とは関係ありません。

...答えはイエスです、私たちは確信することができます。(バニラの場合...私たちは従来のシングル/ UIスレッドについてのみ話していると思いますが、Webワーカーによる処理については話していません)。

また、遅延時間自体はあまり気にしないとおっしゃっていましたが、それでも「クランプ時間」(強制最小遅延)にも注目することをお勧めします。これは、事実上標準化されているようです。 4ms

于 2012-10-04T08:55:46.217 に答える