Javascript Promise.all不等待所有Promise完成firestore数据读取
我有以下数据结构,这些数据结构将作为Javascript Promise.all不等待所有Promise完成firestore数据读取,javascript,promise,google-cloud-functions,google-cloud-firestore,Javascript,Promise,Google Cloud Functions,Google Cloud Firestore,我有以下数据结构,这些数据结构将作为文档添加到firestore集合 { ".......": "......." //few more properties "productInfo": { "0": { "code": "SC05", "price": 400, "productId": "asUsd1HPEPOo2itiKxdash", ".......": ".
文档添加到firestore集合
{
".......": "......." //few more properties
"productInfo": {
"0": {
"code": "SC05",
"price": 400,
"productId": "asUsd1HPEPOo2itiKxdash",
".......": "......." //few more properties
"addOns": [{
"aid": "4casedasgdfdgfas",
"price": "50",
"......": "....." //few more properties
}]
}
}
}
所以我将有一个products对象数组,每个产品都有一个addon对象数组
在将价格保存为文档之前,我试图从数据库中检索价格,因此我为该特定表编写了.onCreate
函数。为了检索产品
级别和插件
级别的价格,我有以下两个承诺:
const productPromises = [];
_.map(products, (product) => {
productPromises.push(new Promise((resolve, reject) => {
db.doc(`product/${product.productId}`).get().then(docData => {
return resolve({
productId: product.productId,
halfkgprice: docData.data().halfkgprice,
price: docData.data().price
});
}).catch(reason => {
return reject(reason);
});
}));
});
const addonPromise = [];
_.map(products, (product) => {
addonPromise.push(new Promise((resolve, reject) => {
if (product.addOns !== undefined && product.addOns !== null) {
return _.map(product.addOns, (addon) => {
return db.doc(`addons/${addon.aid}`).get().then((addonData) => {
return resolve({
price: addonData.data().price
});
}).catch(reason => {
return reject(reason);
})
});
} else {
return resolve();
}
}));
});
然后我就有了
Promise.all([productPromises, addonPromise]).then(result => {
//do something with result
});
但这不会等待任何承诺的解决。当我记录结果时,我得到如下结果
console.log(result) will show [ [ Promise { <pending> } ], [ Promise { <pending> } ] ] and doesn't wait for them to resolve
console.log(结果)将显示[[Promise{}],[Promise{}]],并且不会等待它们的解析
我的问题是,为什么不等待所有的承诺得到解决?我从firestore
getquery
返回数据的方式是否有任何问题?您需要连接2个数组才能使其按预期工作
Promise.all(productPromises.concat(addonPromise)).then(result => {
//do something with result
});
productPromises
和addonPromise
是承诺数组,因此传递给Promise的数组。all
是一个数组数组,而不是承诺数组-试试看
Promise.all([...productPromises, ...addonPromise]).then
另外,避免使用Promise构造函数反模式
_.map(products, (product) => {
productPromises.push(
db.doc(`product/${product.productId}`).get().then(docData => {
return ({
productId: product.productId,
halfkgprice: docData.data().halfkgprice,
price: docData.data().price
});
})
);
});
map
构建一个返回值数组,因此您只需编写:
const productPromises = _.map(products, product => db.doc(`product/${product.productId}`).get()
.then(docData => ({
productId: product.productId,
halfkgprice: docData.data().halfkgprice,
price: docData.data().price
})
);
ProductPromission和addonPromise是承诺数组,因此传递给Promise的数组。all是数组数组,而不是承诺数组-请尝试Promise.all([…productPromises,…addonPromise])。那么
既然已经有一个从get()返回的承诺对象,为什么还要创建一个新的承诺对象。然后().catch()“?@DougStevenson,我没听懂你的意思。@JaromandaX试过了。请稍等片刻。@GuruprasadRao-他的意思是棒极了的兄弟。非常感谢你。这帮了大忙……)这看起来还是很容易的。你能告诉我这是否比目前的方法更好吗?如果是,怎么做?我只是一个理解承诺的初学者,所以我想知道:)看一看地图,了解地图是如何工作的。如何使用它就像一个.forEach()调用。但在它的下面仍然创建了一个[undefined,undefined,undefined…]数组(因为在map函数中没有返回任何内容),然后将其丢弃。一旦您按预期使用map(),它实际上会使事情变得更简单。:)