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

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

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

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

非同期処理

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

Q&A

解決済

2回答

1536閲覧

JavaScriptで非同期処理を制御した場合、同期処理と同じになるか

maskmelon

総合スコア63

JavaScript

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

非同期処理

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

0グッド

0クリップ

投稿2020/08/04 09:39

編集2020/08/09 01:14

初歩的な質問なのですが、JavaScriptで非同期処理を書く場合にはPromiseやasync awaitを使ってフロー制御をすると思うのですが、その場合同期処理と同じになるという解釈で合っているでしょうか?

もうそうだとすれば、非同期処理であることのメリットがなくなってしまうように思うのですが、実際どのような形で非同期処理の特徴が活かされているのでしょうか?

###追記
フロー制御はあくまで非同期処理を同期的に実行するだけで、非同期処理であるということは変わりないという回答をいただきました。

しかし、awaitをつけた処理が実行されている間はそれ以降のプログラムは実行されないのだから、結局同期処理と変わらないような気がしてしまいます。

「同期処理」と「非同期処理を同期的に実行する」ことの違いは何なのでしょうか?

###追記2

const axios = require('axios'); const main = async ()=>{ let res = await axios.get("https://google.com/") console.log(res.status) console.log("終了"); } main();

想定しているasync awaitの使い方は上記のような形です。
awaitで待ってからconsole.logを実行するからresに値が入ると思っていたのですが、間違っているのでしょうか?
このような場合、http通信をしている間に別のプログラムが実行できるということがいまいちイメージできません。

理解が不十分で申し訳ないです。お付き合い頂けると助かります。

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

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

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

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

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

Zuishin

2020/08/07 05:55

> 非同期処理を同期的に実行する これは C# の警告ですが、ほんとうに JavaScript の話ですか? もし C# の話であれば仕組みが違うので通じないと思います。
maskmelon

2020/08/08 19:21

コメントありがとうございます。JavaScriptの話です。async awaitを使うと上から順番にプログラムが実行されますが、これが「同期処理」でも「同期的に非同期処理を実行」でもないとしたら、結局のところ何をしていると捉えれば良いのでしょうか?
coco_bauer

2020/08/08 23:04

「async awaitを使うと上から順番にプログラムが実行されます」というのは、どんなプログラムの事なのでしょうか? また、質問の「フロー制御をすると思う」というのは、どんなプログラムのどの部分なのですか? プログラムのコードを示さずに、プログラムの実行の詳細を議論するのは無理があります。 質問者が何を思っているのなんて、質問者以外の誰にも判りようがないのですから。
maskmelon

2020/08/09 01:16

ご指摘ありがとうございます。コードを追加させていただきました。
guest

回答2

0

ベストアンサー

その場合同期処理と同じになるという解釈で合っているでしょうか?

違います。「Promiseやasync awaitを使っ」ても非同期処理は非同期処理のままです。

投稿2020/08/04 09:40

maisumakun

総合スコア146018

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

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

maisumakun

2020/08/07 05:40

えっと、async-awaitで失われると考えた、「非同期処理であることのメリット」は、どのようなものでしょうか?
maskmelon

2020/08/08 19:29

非同期処理のメリットはI/O処理の際にプログラムを停止することなく待ち時間中に別の処理を実行できる点だと理解しています。async awaitを使うと非同期処理が終わるまでプログラムが先に進まないので、「プログラムを停止」してしまうように思うのですが、どうでしょうか?
maisumakun

2020/08/08 22:20

停止はしません。awaitで待っている間は別のプログラムが実行されます。
maskmelon

2020/08/09 01:40 編集

awaitをつけた箇所だけを非同期処理だと勘違いしていました。実際はasyncで括った部分全体が非同期処理なので、おっしゃる通り別のプログラムを実行できますね。 そうすると非同期処理の内側で同期的な順序で実行されているということになるでしょうか?
guest

0

async内でawaitすることで非同期処理が同期的に処理可能です

投稿2020/08/04 10:32

yambejp

総合スコア116726

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

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

yambejp

2020/08/04 10:34

(async ()=>{ console.log("start"); console.log(await new Promise(resolve=>setTimeout(()=>resolve("promise"),2000))); console.log("end"); })();
maskmelon

2020/08/09 01:38

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問