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: そして、アニメーションの次の「ティック」をスケジューリングする...とは?
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 まとめ
🗂️ Page Index for this GitHub Wiki