【发布时间】:2021-03-08 23:40:44
【问题描述】:
Angular、Firestore
我有一个角度函数来从一个 firestore 集合中获取产品,然后我循环该查询的结果以从另一个集合中查找价格。
在从外部承诺和外部函数本身返回之前,我如何才能等到 forEach 的价格完成?
返回的结果包含一个products数组,但是每个product的prices数组都是空的。
const products = await this.billingService.getProducts();
async getProducts() {
let result = [];
let product = {};
return this.db.collection(
'products',
ref => { ref
let query: Query = ref;
return query.where('active', '==', true)
})
.ref
.get()
.then(function (querySnapshot) {
querySnapshot.forEach(async function (doc) {
product = doc.data();
product['prices'] = [];
await doc.ref
.collection('prices')
.orderBy('unit_amount')
.get()
.then(function (docs) {
// Prices dropdown
docs.forEach(function (doc) {
const priceId = doc.id;
const priceData = doc.data();
product['prices'].push(priceData);
});
});
});
result.push(product);
return result;
});
}
我也尝试过这种方法,但不确定如何访问结果
await this.billingService.getProducts().then(results =>
getProducts() {
const dbRef =
this.db.collection(
'products',
ref => { ref
let query: Query = ref; return query.where('active', '==', true)
});
const dbPromise = dbRef.ref.get();
return dbPromise
.then(function(querySnapshot) {
let results = [];
let product = {};
querySnapshot.forEach(function(doc) {
let docRef = doc.ref
.collection('prices')
.orderBy('unit_amount')
results.push(docRef.get())
});
return Promise.all(results)
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
}
【问题讨论】:
-
async/await 无法按照您在 forEach 循环中所期望的方式工作。 stackoverflow.com/questions/37576685/…
-
停止使用
.forEach()。它不是异步或承诺感知的。使用常规的for循环。 -
@jfriend00
for(const doc of querySnapshot) {类型 'QuerySnapshot' 必须有一个返回 iterator.ts(2488) 的 '[Symbol.iterator]()' 方法 -
@dak -
querySnapshot.docs是您应该能够使用的数组。见doc。
标签: javascript google-cloud-firestore promise