20150927 - kyosen/javascript-ninja GitHub Wiki

第8章 スレッドとタイマの扱い方

8.1 タイマとスレッドの仕組み

  • P202 表8-1-clearTimeout() の説明:"まだ発火されていなければ..." の意味するところは?(辻)
    • 発火前でないと、タイマが存在しないので、キャンセルできない。
  • P205, 206 リスト8-1 の説明:① の中の setTimeout(repeat, 10) の呼出しを長いコードブロックの前に移動させた場合、setIntervalと同じ意味になるのか?(米田)
    • 振る舞いとしてはほぼ同じになる。
    • setTimeoutの場合、異なるidを複数管理する必要性が出て、キャンセルの処理が難しく(複雑に)なるのでは?--> リスト8-1のsetTimeoutの場合は、キューに積まれるハンドラーは必ず一つに限られるので、そうでもない(そのひとつのidを管理すればよい)。
  • キューに存在する場合は発火してもキューにつまれないということだが、setInterval で指定した秒数に発火した際、setInterval の処理中の関数自体はキューにあるとみなされるのか?(辻)
    • 見なされない。
  • 処理の実行に一定時間以上、必ず間隔を設けたい場合、setIntervalではうまくいかないケースがある(図8-1の40ms付近)。

8.2 タイマの最小遅延値と確実性

  • どうやってms単位の時間を計測すればよいか?(辻)
    • Dateオブジェクトにnow()がある: ex. var time = Date.now()

8.3 計算コストが高い処理に対処する

8.4 タイマの集中管理

  • リスト8-4: 実行タイミングはどう決まるのか?(辻)
    • setTimeout(runNext, 0)の"0"を変えることでタイミングを変えることはできる。ここでは、"0"(最少間隔)で連続的に実行する。
    • 同じタイミングで順次実行するものをまとめている。
    • ”タイマ”の集中管理というより複数の関数の実行をまとめる機構。
  • 関数の戻り値falseの意味は?
    • 次回からの実行をキャンセルする。
  • 途中で関数を追加してもよいか?追加できるか?
    • イベント発火は常に起こるが、実行自体はシングルスレッドのため、runNext()の実行途中でtimers関数配列が変わることは基本的にない(呼び出される関数の中でaddする場合などを除いて)。
  • p215: そして、アニメーションの次の「ティック」をスケジューリングする...とは?
    • setTimeout()に相当。

8.5 非同期テスト

  • なぜ即時関数の中で一連の定義を行っているのか?(辻)
    • ”Private”なオブジェクト(queue, paused, runTest())を隠蔽するため。
  • リスト8-5で何が実行されるのか?
    • テキストでは、テストのための関数などの定義のみが行われている。
    • 実際に使用する場合は、この後、test()関数を呼び出す。
  • 何が非同期?
    • 非同期実行する関数をテストする機構を実現するということ。
  • p.218 「ここで重要なポイントは、キューを扱うコードが完全に非同期である(ハンドラの中に含まれている)ため、必ずpause()関数を呼び出した後に実行される、という保証が得られることだ。」という文章は何を言っているのか?(辻)
    • 未解決。
    • 原文では、The important point here is that because the queue-handling code is completely asynchronous(being contained within an interval), it's guaranteed to attempt execution after we've already called our pause() function.

8.6 まとめ