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

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

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

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

JavaScript

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

Q&A

解決済

2回答

625閲覧

順番に処理することができない

inukujira

総合スコア130

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2020/05/31 06:03

編集2020/05/31 06:07

すみません、教えてください。
forEachやmapを使って順番に処理を行う必要があるのですがなかなかうまくいきません。

求める流れは、1番の処理が完了して2番の処理が流れるようにしたいのですが
実際には1番と2番の処理が同時に実行されているような結果になります。

javascript

1// 処理するデータ 2data = [ 3 ["1番"], 4 ["2番"] 5]; 6 7main() 8 9// メイン処理 10async function main() { 11 12 //順番に処理 13 await Promise.all(data.map(async i => { 14 console.log(i[0]+"の処理開始!") 15 const result = await execute(i) 16 console.log(result) 17 })), 18 19 // 終了通知 20 console.log("全てのmain()処理完了!") 21} 22 23// 同期処理 24async function execute(i) { 25 return new Promise((resolve, reject) => { 26 setTimeout(()=>{ 27 resolve(i[0]+"の処理が今終わったよ!"); 28 }, 1000); 29 }); 30}

以下の実行結果になってしまいます。

1番の処理開始!

2番の処理開始!
1番の処理が今終わったよ!
2番の処理が今終わったよ!
全てのmain()処理完了!

【理想】

1番の処理開始!

1番の処理が今終わったよ!
2番の処理開始!
2番の処理が今終わったよ!
全てのmain()処理完了!

new promiseを使ってresolveを待ち受けるようにもしたのですが結果は変わらず。
どのようにすれば正しく処理を行うことができますでしょうか?
(同期処理関数(execute)部分は諸事情によりsetTimeout使って疑似的に同期実行を再現しているため一切変更できないモノとします)

以下、実際に動くデモをご用意しました。
https://stackblitz.com/edit/js-kgctbu?file=index.js

大変申し訳ありませんがどなたかご教示いただけると幸いです。

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

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

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

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

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

gentaro

2020/05/31 06:10

正直なにがやりたいのか意味がわかりませんが、「理想」に書かれている通りの結果を得たいのであればそれは直列に処理したいということでしか無いので、わざわざ非同期化する意味ないんで、素直にforEachで順に処理すりゃ良いだけでは。
guest

回答2

0

ベストアンサー

こんな流れです

javascript

1const data = [ 2 ["1番"], 3 ["2番"] 4]; 5const main=async ()=>{ 6 for(var i=0;i<data.length;i++){ 7 console.log(data[i][0]+"の処理開始!"); 8 await execute(data[i]).then(console.log); 9 }; 10 console.log("全てのmain()処理完了!") 11} 12const execute=async i=>{ 13 return new Promise((resolve, reject) => { 14 setTimeout(()=>{ 15 resolve(i[0]+"の処理が今終わったよ!"); 16 }, 1000); 17 }); 18} 19main();

投稿2020/05/31 06:28

yambejp

総合スコア114779

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

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

inukujira

2020/05/31 07:37

ありがとうございました!完璧に求める処理を行うことができました!助かりました!
guest

0

リンク内容
リンク内容
こんなですか?

投稿2020/05/31 06:12

Nippun

総合スコア1147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問