私はFirebase Cloud Firestoreを使用していますが、これはもっとJavaScript非同期対同期の約束の返品の問題かもしれません。私の約束/機能から復帰する前にforEachが完了するのを待つ
私は1つのコレクションからIDを取得するためにクエリを実行しています。そのクエリの結果をループして、そのIDに基づいて別のコレクションの個々のレコードを参照しています。
次に、見つかった各レコードを配列に格納し、配列全体を返したいとします。
results.length
は、forEachが完了する前にreturn results
が発生するため、常に0です。私が内部でresults.length
を印刷すると、それはデータを持っています。
外側の約束と外側の関数自体から戻る前にforEachが完了するまで、どうすればいいですか?
getFacultyFavoritesFirebase() {
var dbRef = db.collection("users").doc(global.user_id).collection("favorites");
var dbQuery = dbRef.where("type", "==", "faculty");
var dbPromise = dbQuery.get();
var results = [];
return dbPromise.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
var docRef = db.collection("faculty").doc(doc.id);
docRef.get().then(function(doc) {
if (doc.exists) {
results.push(doc);
}
})
});
console.log(results.length);
return results;
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
}
プロミスの配列を1つの約束事にマージするには、「Promise.all」を使用できます。 – 4castle