如何等到所有 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 这些承诺。
那么就不需要调用 push
。 map
调用将创建数组:
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
});
我的目标是从 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 这些承诺。
那么就不需要调用 push
。 map
调用将创建数组:
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
});