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

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

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

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

Q&A

解決済

2回答

3377閲覧

Node.js 非同期(async)メソッドの待ち合わせをしたい

usop

総合スコア64

Node.js

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

0グッド

0クリップ

投稿2019/08/15 06:39

編集2019/08/15 06:40

以下のソースの様に、asyncの関数を即時実行させて、その返り値を取得した時に、Promiseオブジェクトが返却されてしまいます。
非同期メソッド即時実行させたあと、非同期の処理を待ち合わせする方法ってありますでしょうか??
よろしくお願いいたします。

Javascript

1const promiseMethod = (index) => { 2 return new Promise((resolve, { }) => { 3 setTimeout(() => { 4 console.log(index); 5 resolve(index); 6 }, Math.random() * 200); 7 }); 8} 9 10const num = (async () => { 11 let a = [] 12 let result = 0; 13 for (let index = 0; index < 10; index++) { 14 const retValue = await promiseMethod(index); 15 result += retValue; 16 a.push(result) 17 } 18 console.log(a); 19 return a 20})(); 21 22console.log(num) //<-- ここで非同期メソッドの待ち合わせしたい!

terminal

1$ node example/async_test.js 2Promise { <pending> } 30 41 52 63 74 85 96 107 118 129 13[ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45 ]

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

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

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

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

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

guest

回答2

0

asyncの関数を即時実行させて、その返り値を取得した時に、Promiseオブジェクトが返却されてしまいます。

async関数の勉強が足りてませんね。
勉強が捗るようにちょっとアドバイス

async関数というのは、第一行目をreturn new Promise(fn)でまるっと括った糖衣構文を指します。
なのでお外で使うには普通のnew Promiseで作ったインスタンスだと思って、
await構文やpromise.thenメソッドを繋げて実行させてください。

因みにawait構文もasync関数内で使える糖衣構文です。
こちらは右辺に.then(fn)をひっつけてPromiseの完了を一生待つというコードを内包しています。


多少質問文の関数をリファクタリングして、こんな感じのが完成形になると思います。

JavaScript

1// 関数1個の場合は引数のカッコを省略した方がスマート 2const promiseMethod = index => new Promise(resolve => { 3 setTimeout(() => { 4 console.log(index); 5 resolve(index); 6 }, Math.random() * 200); 7}); 8 9const num = (async () => { 10 let a = [] 11 let result = 0; 12 for (let index = 0; index < 10; index++) { 13 const retValue = await promiseMethod(index); 14 result += retValue; 15 a.push(result) 16 } 17 console.log(a); 18 return a 19})(); 20 21// これでおk 22num.then(console.log); 23 24// awaitで受け取りたいならasyncで括ったmain関数を用意しておく 25const main = (async () => { 26 console.log(await num); 27})();

投稿2019/08/16 04:10

miyabi-sun

総合スコア21158

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

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

0

ベストアンサー

こういうことですか?

diff

1const promiseMethod = (index) => { 2 return new Promise((resolve, { }) => { 3 setTimeout(() => { 4 console.log(index); 5 resolve(index); 6 }, Math.random() * 200); 7 }); 8} 9 10const num = (async () => { 11 let a = [] 12 let result = 0; 13 for (let index = 0; index < 10; index++) { 14 const retValue = await promiseMethod(index); 15 result += retValue; 16 a.push(result) 17 } 18 console.log(a); 19 return a 20})(); 21 22-console.log(num) //<-- ここで非同期メソッドの待ち合わせしたい! 23+num.then(x => { 24+ console.log("---") 25+ console.log(x) 26+})

投稿2019/08/15 06:51

gentaro

総合スコア8949

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

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

usop

2019/08/15 06:56

なるほど、ありがとうございます!よくNodeがわかったっていなくて、助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問