質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

4回答

3104閲覧

JavaScriptの非同期処理を理解したい

inumaeda

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

1クリップ

投稿2021/04/22 07:55

実現したいこと

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秒。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

つまりsetTimeoutで「待つ」という処理が同時に走っているように思うのです。

setTimeoutは「待つ」という能動的な処理をしているのではなく、「この時間にこの処理をする」という登録をしているだけです。

投稿2021/04/22 08:05

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

setTimeoutは、タイマの設定するだけなので即実行は終了します

setTimeout(onFirst, 2000);

2秒後に実行

setTimeout(onSecond, 4000);

4秒後に実行

ということで、双方ともまったくそのとおりの動作となってますね

投稿2021/04/22 08:03

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inumaeda

2021/04/22 08:57

ご回答ありがとうございます! 処理は即終了するのですね! ということは待ち時間をカウントして完了通知を送る、という処理はJavaScriptではない何かがやっているということですね? それって何なのでしょうか? もしご存知でしたらお教えください。 よろしくお願いします。
y_waiwai

2021/04/22 09:16

Javascriptがバックで動いていてその時間になったらなんやからうごかすんでしょうね
guest

0

こうしてみてはどうでしょうか。

js

1function doSample() { 2 setTimeout(onFirst, 2000); 3 4 5 function onFirst() { 6 console.log("first"); 7 setTimeout(onSecond, 4000); 8 } 9 10 function onSecond() { 11 console.log("second") 12 } 13} 14doSample();

参考:
✨♻️ JavaScript Visualized: Event Loop - DEV Community

JavaScript イベントループの仕組みをGIFアニメで分かりやすく解説 | コリス

投稿2021/04/22 08:01

編集2021/04/22 08:14
Lhankor_Mhy

総合スコア36960

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

javascript

1async function doSample(){ 2 console.log("start"); 3 await new Promise(resolve=>{ 4 setTimeout(()=>{ 5 resolve(); 6 }, 2000); 7 }); 8 onFirst(); 9 await new Promise(resolve=>{ 10 setTimeout(()=>{ 11 resolve(); 12 }, 4000); 13 }); 14 onSecond(); 15 console.log("end"); 16 function onFirst() { 17 console.log("first"); 18 } 19 function onSecond() { 20 console.log("second"); 21 } 22} 23doSample();

投稿2021/04/22 08:21

編集2021/04/22 09:23
yambejp

総合スコア116734

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問