前提・実現したいこと
目的はjavascriptでユーザー名をfirestoreから取得することです。
ただし、ユーザー名は変更できるようにしたいため、
[users(コレクション)]→[ユーザーid(ドキュメント)]→[ユーザー名(フィールド)]
という形でデータを格納しています。(下図参照)
ここで、ユーザーidによる乗客リスト(passenger_list)を作成します。そして、その要素ごとにユーザー名をfirestoreから取得したところ、正常に動作しました。
(例)乗客の数:2名
javascript
1var passenger_list =["1番目のuid", "2番目のuid"]; 2for ( var i = 0,len = passenger_list.length; i < len; i++ ) { 3 db.collection("users/").doc(passenger_list[i]).get().then(function(doc) { 4 if (doc.exists) { 5 passenger_name = doc.data().name; 6 console.log(passenger_name); 7 } 8}); 9} 10// 実行結果: 11// "1番目のusername" 12// "2番目のusername"
発生している問題・エラーメッセージ
しかしながら、このプログラムをforループさせたところ、実行結果が以下のようになりました。
該当のソースコード
(例)ループ回数:2回 乗客の数:2名
javascript
1for ( var j = 0; j < 2; j++ ) {//j:ループ回数 2 var passenger_list =["1番目のuid", "2番目のuid"]; 3 for ( var i = 0,len = passenger_list.length; i < len; i++ ) { 4 db.collection("users/").doc(passenger_list[i]).get().then(function(doc) { 5 if (doc.exists) { 6 passenger_name = doc.data().name; 7 console.log(passenger_name); 8 } 9 }); 10 } 11} 12// 実行結果: 13// "1番目のusername" 14// "1番目のusername" 15// "2番目のusername" 16// "2番目のusername"
本来は
"1番目のusername"
"2番目のusername"
"1番目のusername"
"2番目のusername"
という風に動作させたいのですが、その方法が分からなかったため質問させていただきました。
試したこと
Consoleで検証したところ、if (doc.exists) {}が4回連続で実行されていました。即ち、ループ終了時にデータベースから一度にユーザー名が取得されていると考えられます。
また、jsのpromiseや、jQueryの.when.doneなども試しましたが、同様の結果となりました。(firestoreを使った途端に実行順序が変わってしまいます。)
つきましては、目標の動作を行う方法をご教授いただければ幸いです。
また、ユーザーidとユーザー名の構成をより簡潔にする方法などもありましたら教えていただきたいと思います。
当方初学者ですので、低レベルな質問だとは思いますが、よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。