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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

1回答

603閲覧

同期処理と非同期処理の実行順序が決まる仕組みについて

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2017/10/22 15:06

こんなコードを書いてみました。

function asyncRun(callback) { callback('async'); console.log('asyncRun is called'); callback('async'); } function syncRun(callback) { callback('sync'); console.log('syncRun is called'); callback('sync'); } function asyncFunc(value) { setImmediate(() => { console.log(value); }) } function syncFunc(value) { console.log(value); } console.log('=1=') asyncRun(asyncFunc); console.log('=2=') syncRun(syncFunc); console.log('=3=')

ログ出力をみると結果はこうです。

=1= asyncRun is called =2= sync syncRun is called sync =3= async async

非同期処理は全ての同期処理が終わってから実行開始されるという解釈で良いのでしょうか?

例えば、同期処理の数がものすごく多い場合は、それらが全て終わってからではないと、非同期処理は実行されないのでしょうか?

あ、あれ?普通、非同期処理が先に走りませんでしたっけ?
なんで、こういう順序になってるんだろ。

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

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

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

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

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

guest

回答1

0

Javascriptのプログラミングでは単一スレッドが前提なので同期的な処理は必ず連続して最後まで実行されます。(async/awaitのようなものはこの際除外して考えたほうが混乱しなくてすむと思います)

このコードではasyncFunc内部のsetImmediateの第一引数の関数本体(A)の実行以外が同期的な実行にあたりますので、それらが全て順番に実行されます。最後に実行されるのは'=3='の出力になります。これらすべてが完了するとeventループへ戻り、先ほど登録された(A)が登録順に起動されます。ということで

非同期処理は全ての同期処理が終わってから実行開始されるという解釈で良いのでしょうか?
例えば、同期処理の数がものすごく多い場合は、それらが全て終わってからではないと、非同期処理は実行されないのでしょうか?

どちらもYESです。

普通、非同期処理が先に走りませんでしたっけ?

非同期処理はこんな具合に動きます。例えば

setTimeout(callback, 1000)

を実行するとsetTimeout自体は同期的に実行されます。その第一引数であるcallbackは「1秒経過した以降にeventループから起動されるように登録される仕組みです。1秒経過時に同期処理が動いていたらそれが完了してeventループへ戻ってくるまで起動は待たされます。

「非同期処理が先に走る」というのは「同期部分」「非同期部分」が何かを曖昧に捉えておられることからくる誤解のような気がします。javascriptコードに出てくるのは「非同期処理を起動する関数呼び出し」と「非同期処理が完了した際に起動されるcallbackの実行」だけですので、「起動から完了までの間、Javascriptコードとは別の世界で動作している非同期処理の実行」と「完了時に起動されるJavascriptのコールバック関数の起動契機」をごっちゃにして考えると混乱してしまうと思います。

投稿2017/10/22 16:04

編集2017/10/22 22:20
KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問