如何等到所有 Promise 都完成?

How to wait until all of Promise are fulfilled?

我的目标是从 Firestore 文档中具有 reference 数据类型的字段中获取数据。我使用嵌套承诺来获取数据。当前的代码没有等到所有的 Promise 都完成。

如何让results.push( object )等待所有的Promise完成?

预期结果

data = {
  createdDate,
  expectedDate,
  customer_name = "John", // name from a document in `customer` collection.
  user_name = "Sherly", // name from a document in `user` collection.
}

实际结果,customer_name 是“”而不是从 customer 集合中的文档中提取的“John”。

data = {
  createdDate,
  expectedDate,
  customer_name = "",
  user_name = "",
}
  firebase
    .firestore()
    .collection("sales_order")
    .get()
    .then(function (querySnapshot) {
      let results = [];
      querySnapshot.forEach(function (doc) {
        let data = doc.data();
        console.log(data);
        const createdDate = data.createdDate.seconds;
        // const deliveryDate = data.deliveryDate ? data.deliveryDate.seconds : null;
        const expectedDate = data.expectedDate.seconds;

        let customer_name = "";
        data.customer.get().then(function (doc) {
          if (doc.exists) {
            const { name } = doc.data();
            customer_name = name;
          }
        })

        let user_name = "";
        data.user.get().then(function (doc) {
          if (doc.exists) {
            const { name } = doc.data();
            console.log(name);
            user_name = name;
          }
        })

        results.push({
          id: doc.id,
          data: {
            createdDate,
            // deliveryDate,
            expectedDate,
            customer_name,
            user_name,
            // total,
            // invoiceStatus,
          },
        });
      });

      return results;
    })

编辑: 参考:

一位社区成员建议我查看参考链接,它确实可以帮助您更好地了解 Promise。 trincot 先生的回答正是我要找的,虽然没有参考链接,我无法理解 Promise 的工作原理。

感谢匿名社区成员和 trincot 先生让我深入了解 Promise 的工作原理。

对于循环的内部部分,您可以链接 then 调用并在最终的 then 回调中调用 push,或者,您可以将两个 promise 结合起来.get()Promise.all 参数中查找。

外循环应该 return 一个承诺列表,然后您也可以将其提供给 Promise.all。我建议用 docs.map 循环替换 forEach 循环,这样可以 return 这些承诺。

那么就不需要调用 pushmap 调用将创建数组:

Promise.all(firebase.firestore().collection("sales_order").get().then(function (querySnapshot) {
    return querySnapshot.docs.map(function (doc) {
        let data = doc.data();
        return Promise.all([data.customer.get(), data.user.get()]).then(function (docs) {
            return docs.map(doc => doc.exists ? doc.data().name : "");
        }).then(function ([customer_name, user_name]) { 
            return {
                id: doc.id,
                data: {
                    createdDate: data.createdDate.seconds,
                    expectedDate: data.expectedDate.seconds,
                    customer_name,
                    user_name,
                },
            };
        });
    });
})).then(function (results) {
    // deal with results here
});