非同期処理について (setTimeout)

200ミリ秒でボタンを押す → 4000ミリ秒待機 → 残りの1800ミリ秒待機 → 6000が出力となるのではないかと思っていました。

なりません。これには2つの要因があります。

  • setTimeoutは、「何ミリ秒後に動かす」というリストに登録する処理を行う、というイメージです。積極的に待ち続けるという処理を行うものではありません。
  • JavaScriptはシングルスレッドなので、while()で回し続けるようなビジーループをかけると、他のハンドラ類も一切動かなくなります。

ということで、タイムラインとしては以下のようになります。

0ミリ秒→setTimeoutでタイマーが登録される
200ミリ秒→ボタンを押してビジーループがスタート
2秒→setTimeoutのタイマーが時間を迎えるけど、ビジーループがまわり続けているので動作しない
4.2秒→ビジーループが終了したことで、ようやくsetTimeoutのハンドラが動作

コメントを投稿

0 コメント