🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

2回答

1452閲覧

javascriptのasync/awaitがうまくいかない

takao99

総合スコア26

JavaScript

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

0グッド

0クリップ

投稿2021/01/06 23:29

javascriptでasync/awaitを使って逐次処理をしたいのですが、
下記のソースだと逐次処理になりません。
どこが間違っていますでしょうか?
またどうすれば逐次処理になりますでしょうか?
よろしくお願いします。

async function processAll() { await process1() await process2() await process3() } const process1 = async function() { await setTimeout(function() { console.log("process1") }, Math.random() * 1000); } const process2 = async function() { await setTimeout(function() { console.log("process2") }, Math.random() * 1000); } const process3 = async function() { await setTimeout(function() { console.log("process3") }, Math.random() * 1000); } processAll();

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

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

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

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

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

m.ts10806

2021/01/06 23:36

ブラウザは何でしょうか。 あと、いきなりMath.random()で0にもなり得る値を突っ込むのは悪手かと思います。「絶対にかぶらないくらい大げさに大きい数値」から確かめてみてください。
takao99

2021/01/06 23:59

いきなりMath.random()で0にもなり得る値を突っ込むのは悪手かと思います。「絶対にかぶらないくらい大げさに大きい数値」から確かめてみてください。 >そこは今本質ではありませんので。
m.ts10806

2021/01/07 00:06

Math.randomで機能を殺す可能性がある実装をしておいて本質も何もないと思います。
Zuishin

2021/01/07 00:17 編集

本質は何でしょうか? どこに問題があるかわからないなら本質がどこにあるかもわからないと思いますが。 逆に本質がわかるなら容易く解決できると思います。 await できない setTimeout を await しようとしているというのが問題の本質のように思いますが、ここを無視するということは、本質は他にあるということですね? 本質がわかるコードに書き直してください。 Math.random が本質に無関係なのであれば、定数に書き直す方がノイズが少なくなります。
takao99

2021/01/07 00:50

本文にも書いてある通り逐次処理をしたいが本質です。 Math.randomは擬似的に実行のタイミングをずらすために用いています。 実行のタイミングが違うものを順番に実行するにはどうすればいいか? これが本質になります。 https://qiita.com/_takeshi_24/items/1403727efb3fd86f0bcd こちらを参考にしたのですが、HTTPリクエストでうまくいっているので、上記のソースでもうまくいくと思ったのですがなぜダメなのでしょうか?
coco_bauer

2021/01/07 01:06

asyncは、非同期(asynchronous)ということです。非同期(同期しない)ので、実行順序が定まりませんから、逐次実行されるかどうかは判りません。 ピザ屋と寿司屋と蕎麦屋に、それぞれ電話で注文した場合を思い浮かべてください。ピザ、寿司、蕎麦、の順で届くとは限りませんよね。
takao99

2021/01/07 01:11

awaitで結果が返ってるまで待機するみたいですよ。
yambejp

2021/01/07 01:23

setTimeoutは終了を感知できないタイプの非同期処理ということです
takao99

2021/01/07 01:29

なんでもawaitを付けたらいいわけではないのですね。勉強になりました。
Zuishin

2021/01/07 01:32 編集

await できる条件はここの二番目のコメントにあります。setTimeout が await できないことは更にもう一度書きました。
guest

回答2

0

ベストアンサー

setTimeoutはasync処理で制御できないですからpromiseを利用します

javascript

1const process1 = async ()=>{ 2 await new Promise(resolve=>setTimeout(()=>{ 3 console.log("process1"); 4 resolve(); 5 }, Math.random() * 1000)); 6}

投稿2021/01/07 00:24

編集2021/01/07 00:24
yambejp

総合スコア116688

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

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

takao99

2021/01/07 01:21

ありがとうございます。こちらで逐次処理がうまくできました。
guest

0

async function processAll() { await process1() await process2() await process3() } const process1 = async ()=>{ await new Promise(resolve=>setTimeout(()=>{ console.log("process1"); resolve(); }, Math.random() * 1000)); } const process2 = async ()=>{ await new Promise(resolve=>setTimeout(()=>{ console.log("process2"); resolve(); }, Math.random() * 1000)); } const process3 = async ()=>{ await new Promise(resolve=>setTimeout(()=>{ console.log("process3"); resolve(); }, Math.random() * 1000)); } processAll();

投稿2021/01/07 01:30

takao99

総合スコア26

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問