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

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

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

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

986閲覧

typescriptのasync,awaitでwaitされない。

tomohirochitera

総合スコア1

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2020/05/09 13:23

前提・実現したいこと

最後の console.log('isDone : ',isDone); が
markets.forEach(async (aMarket) の終了を待たずに
出力されてしまいます。

 markets.forEachのまえにawaitしても変化がありませんでした。

該当のソースコード

typescript

1export const detectBidPrices = 2 functions.firestore.document('{eventId}/combat_data/combat_history/{serialNo}/markets/{market}/bidders/{uid}') 3 .onUpdate(async (change,context) =>{ 4 //BidBook のacceptUsersと markets事にpriceがあるかどうかで判断 5 let eventId = context.params.eventId; 6 let serialNo = context.params.serialNo; 7 let market = context.params.market; 8 let uid = context.params.uid; 9 //let size = (await admin.firestore().collection(eventId+'/combat_data/combat_history/'+serialNo+'/markets/'+market+'/bidders').where('price','>',0).get()).size 10 //console.log('size = ',size); 11 12 let markets; 13 let acceptUsers = 0; 14 await admin.firestore().doc(eventId+'/combat_data/combat_history/'+serialNo).get() 15 .then(async (aDoc) => { 16 acceptUsers = await aDoc.data().acceptUsers; 17 markets = await aDoc.data().markets; 18 }).catch((err) => { 19 console.log('error get joins allUsers'); 20 }); 21 //firebase-debug.logconsole.log(acceptUsers,size); 22 let isDone = true; 23 markets.forEach(async (aMarket) => { 24 let count = 0; 25 await admin.firestore().collection(eventId+'/combat_data/combat_history/'+serialNo+'/markets/'+aMarket+'/bidders').where('price','>',0).get().then( (data) => { 26 count = data.size; 27 console.log('count : ',count); 28 }).catch((err) => console.log(err)); 29 console.log('outside count : ',count); 30 if(count != acceptUsers) isDone = false; 31 32 }); 33 34 35 console.log('isDone : ',isDone); 36 37 return 0; 38});

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

forEachでasyncのメソッドを連発しても、forEachはそのメソッドの終了待たずに次の処理に行くだけなんでそりゃそうなるような。

このへん読んでみたら良いんじゃないでしょうか。

投稿2020/05/09 16:56

編集2020/05/09 17:05
gentaro

総合スコア8947

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

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

tomohirochitera

2020/05/10 07:44

ありがとうございます。教えて頂いたサイトを見て解決出来ました!!!
gentaro

2020/05/10 10:16

それは良かったです。 解決済みにしておいてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問