setTimeout(func, 0)
が呼び出された関数に大きな遅延を引き起こす原因を知っている人はいますか? setTimeout(func, 0)
が実行されてから実際にfunc
が呼び出されるまでの間に、1.2秒以上の遅延が見られます。setTimeout(コールバック、0)からのコールバックの遅延の原因
私はこの動作をChrome v52でのみ表示します(v51にはこの機能がありません)。だから、Chromeの問題かもしれませんが、バグとして報告する前に、私はそれを調査したいと思います。
私は残念ながらそれをreprosする小さなケースを持っていません。これは、スクロールイベントに応答してAngularJSアプリで発生します。マウスホイールでスクロールイベントトリガーを処理します。その一部として、setTimeout(func, 0)
を呼び出してフォローアップ作業を行います。
Chrome devtoolsを使用すると、この1.2秒のギャップの間に実行されるjavascriptがほとんどないことがわかります。私はスレッドをブロックしていません。実際には、console.profileとconsole.profileEndを使用して、特定の1.2秒間のgrapをプロファイルしました。その時間の99%がアイドルであることを示しています。
devtoolsでタイムラインを見ると、その期間中に「マウスホイール」イベントが処理されることがわかります。それらの多くがあります(ギャップの最初の1秒間は5ミリ秒毎に1つです)。マウスホイールがその時間の間にスクロールされていないので、これは少し奇妙です。私はMac Magic Mouseの仮想スクロールホイールを1回フリックし、スクロール可能な領域の上部に叩きつけます。イベントが終了した後、マウスホイールイベントが発生し続けます。
誰にもアイデアはありますか?非常に速く実行されるマウスホイールイベントの小さなストリームがコールバックの呼び出しを遅らせることができますか?そのタイムアウトコールバックがその予定時刻の1.2秒後に呼び出された理由を調査する方法はありますか?
:setTimeoutのショーコールバックを表すタイムラインの画像が追加されました。画像
のsetTimeout(FUNC、0)タスクに並んイベントがすでに存在する場合、あなたのコードが第二の0で、実行されます保証するものではありませんを含めるためにここに投稿
バグとして報告するには、再現可能な例が必要です。だから、躊躇せずに投稿してください。 – estus
'setTimeout(func、0)'は、関数をキューに入れ、次のイベントループと呼ばれるようにスケジューリングします。つまり、次の "tick"と言います。ブラウザはUI用のスレッドを1つしか使用しないため、何か問題が発生する可能性があります。マウスのホイールイベントは関連している可能性がありますが、何や理由があるかを調べることなく明確な方法があるとは思いません。 – vlaz
これが起こったときにタイムラインを示す画像を追加しました。コンソールは 'setTimeout'メソッドが呼び出されたときとコールバックが実行されたときにログを記録します。この例では、1.4秒以上かかる。要約グラフは、大部分の時間、アイドル状態であることを示しています。それは本当に誰かがスレッドをホギングしていることができますか? – Steven