実現したいこと
JavaScriptの非同期処理を理解したいです。
知っているのは、JavaScriptはシングルスレッドだということです。
私がどこを勘違いしているのか教えていただけると幸いです!
疑問点
疑問点は、下記コードがなぜ合計4秒で終了するのか?ということです。
シングルスレッドなら合計6秒かかるのではないのでしょうか?
シングルスレッドなら2+4=6秒
マルチスレッドなら4秒
という気がします。
つまりsetTimeoutで「待つ」という処理が同時に走っているように思うのです。
setTimeout
function doSample() { setTimeout(onFirst, 2000); setTimeout(onSecond, 4000); function onFirst() { console.log("first") } function onSecond() { console.log("second") } } doSample();
↓出力結果
first ←2秒後に表示
second ←さらに2秒後に表示
合計で4秒。
非同期処理(Promise)
また、下記コードは合計6秒かかります。
setTimeoutだけが特殊なのでしょうか?
//指定秒後にログ表示 function waitAsync(time){ return new Promise(function(resolve, reject) { const start = Date.now(); while(Date.now() - start < time){ } resolve(time); }); } waitAsync(2000) .then((time) => { console.log(time) }) waitAsync(4000) .then((time) => { console.log(time) })
↓出力結果
2000 ←6秒後に表示
4000 ←上と同時に表示
合計で6秒。
同期処理
下記コードも合計6秒。
ただし、出力に間隔があります。
//指定秒後にログ表示 function wait(time){ const start = Date.now(); while(Date.now() - start < time){ } console.log(time); } wait(2000); wait(4000);
↓出力結果
2000 ←2秒後に表示
4000 ←さらに4秒後に表示
合計で6秒。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。