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
get
query
返回数据的方式是否有任何问题?

您需要连接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(),它实际上会使事情变得更简单。:)