ホームページ  >  に質問  >  本文

javascript - setInterval 実行メカニズムについて

//更新: この質問には参考価値がなく、少々頭を消耗するため、クローズを申請しました。詳細については、以下の私の回答を参照してください。

2 日前に言及されたブログを見ました: setInterval コールバック関数の実行時間が指定された遅延時間よりも大きい場合、タイマーがトリガーされたとき、タスク キューに同じタイマーのコールバック関数がある場合、これはcallback は無視されます。これは、タスク キュー内に同じタイマーに対する 2 つ以上のコールバック関数が存在しないことを意味します。ステートメントは不明瞭です。コードを見てください:

例 1

リーリー

setInterval は 100ms ごとにタスク キューに関数を追加し、setInterval は 1000ms 後にクリアされます。この結果を上記の文に従って説明してください:

  1. 最初の for ループを 100 ミリ秒でタスク キューに入れると、アイドル状態のメイン スレッドがこのループの実行を開始します。これには 863 ミリ秒かかります;

  2. 最初の for ループの実行中、2 番目のタイマーが 200 ミリ秒でトリガーされ、2 番目の for ループはメインスレッドがアイドル状態になるまで空のタスク キューに置かれ、964 ミリ秒後に 2 回目の実行が開始されます。 for ループ;

  3. 3 番目から 8 番目のタイマー (理論上のシーケンス番号) がトリガーされると、メインスレッドは最初の for ループを実行しており、タスク キューには 2 番目の for ループがあるため、これらの関数は無視されます。タスクキューに入ります;

  4. 900ms で、9 番目のタイマーがトリガーされ、メインスレッドが 2 番目の for ループを実行しています。このタイマーの関数はタスク キューに存在しないため、このタイマーの関数はタスクに入れられます。これは結果の「3 番目のタイマー」です;

  5. 1000 ミリ秒で、10 番目のタイマーがトリガーされますが、これは 3 番目のタイマーと同じ理由で無視され、setInterval がクリアされます。

例 2

しかし、別のテスト例の結果はこのようではありません

リーリー

ブラウザは最初に for ループを実行しますが、私のコンピュータでは約 13 秒かかりました (コンピュータの調子が悪い...)。上記のステートメントによると、この 13 秒間、タスク内に存在するタイマーは 1 つだけです。 queue.関数を実行すると、実行結果は 13 秒後に 13 個の「タイマー」を同時に出力し、関数を 1 秒サイクルで実行します。

###質問###

上の 2 つの例は矛盾しています。この場合、setInterval はどのように機能しますか?できれば信頼できる情報を添えて、明確な回答をいただければ幸いです。ありがとうダカール。

过去多啦不再A梦过去多啦不再A梦2734日前640

全員に返信(2)返信します

  • PHP中文网

    PHP中文网2017-05-19 10:37:06

    この質問をしましたが、今、少し混乱しているように感じます。 。 。
    2 番目の例では、for ループの実行中に js スレッドが占有されており、次のステートメントが解析されていません。つまり、タイマーが登録されていません。例を変更して実行時間を追加します:

    リーリー

    この例をテストに使用すると明らかになります。 上記の for ループは約 1544 ミリ秒実行されました。この時点で、js スレッドがステートメントを解析し、タイマーが登録され、その後通常どおり実行されました。

    したがって、2 つの例の間に矛盾はありません。メインスレッドがタイマー関数を実行しており、タスクキューに同じタイマー関数がある場合、この期間中にすべてのタイマートリガーが発生します。

    返事
    0
  • 巴扎黑

    巴扎黑2017-05-19 10:37:06

    ただし、setInterval の例 2 は終了する前に実行されませんでした

    返事
    0
  • キャンセル返事