Typescript Firebase函数:是否有方法异步迭代多个集合?
编写API时,我希望收集对象的集合并提取它们的每个属性。一个属性是每个对象内的集合。但是,Typescript Firebase函数:是否有方法异步迭代多个集合?,typescript,firebase,google-cloud-firestore,google-cloud-functions,Typescript,Firebase,Google Cloud Firestore,Google Cloud Functions,编写API时,我希望收集对象的集合并提取它们的每个属性。一个属性是每个对象内的集合。但是,似乎不支持异步迭代 伪代码(使用TypeScript): 以下代码不等待填充对象,并且不返回任何内容 有什么建议吗?您在这里犯的错误是,您传递给forEach的回调不应标记为async。所有异步函数立即返回一个承诺,该承诺在函数中所有其他等待的异步工作完成时解析。这意味着forEach将在不等待解决的情况下迅速兑现所有这些承诺。迭代完成后,每个回调中的异步工作将完成。这并不是您真正想要使用forEach的方
似乎不支持异步迭代
伪代码(使用TypeScript):
以下代码不等待填充对象
,并且不返回任何内容
有什么建议吗?您在这里犯的错误是,您传递给forEach的回调不应标记为async。所有异步函数立即返回一个承诺,该承诺在函数中所有其他等待的异步工作完成时解析。这意味着forEach将在不等待解决的情况下迅速兑现所有这些承诺。迭代完成后,每个回调中的异步工作将完成。这并不是您真正想要使用forEach的方式
如果要对每个文档快照执行一些异步工作,并收集所有异步工作的结果,则应在
objectSnapshot.docs
中迭代文档数组。然后,您可以对每个文档执行进一步的异步工作。按照JavaScript的习惯,使用数组的map()
函数将文档快照数组转换为承诺数组。然后,您可以在该承诺数组上使用Promise.all()
,等待所有工作完成。这里犯的错误是,传递给forEach的回调不应标记为异步。所有异步函数立即返回一个承诺,该承诺在函数中所有其他等待的异步工作完成时解析。这意味着forEach将在不等待解决的情况下迅速兑现所有这些承诺。迭代完成后,每个回调中的异步工作将完成。这并不是您真正想要使用forEach的方式
如果要对每个文档快照执行一些异步工作,并收集所有异步工作的结果,则应在
objectSnapshot.docs
中迭代文档数组。然后,您可以对每个文档执行进一步的异步工作。按照JavaScript的习惯,使用数组的map()
函数将文档快照数组转换为承诺数组。然后,您可以在该承诺数组上使用Promise.all()
,等待所有工作完成。问题是forEach本身并不是同步运行的,因此您在有机会填充对象之前返回对象
你有几个选择来解决这个问题,在你的情况下,我建议你返回一系列承诺,并等待它们完成后再返回。大概是这样的:
const objectSnapshot = await admin.firestore().collection('object').get();
// Creates an array of promises that can be awaited later
// You can use the docs property which is an array, and then you can use map on it
const promises = objectSnapshot.docs.map(async (objectDoc) => {
// This will execute in parallel but will create a promise and add it to promises
const valueSnapshot = await admin.firestore().collection('object').doc(objectDoc.id).collection('value').get();
return valueSnapshot.docs.map((valueDoc) => valueDoc.data());
});
// Wait for all promises created before returning
return await Promise.all(promises);
问题是forEach本身并不是同步运行的,所以您在对象有机会填充之前就返回了对象 你有几个选择来解决这个问题,在你的情况下,我建议你返回一系列承诺,并等待它们完成后再返回。大概是这样的:
const objectSnapshot = await admin.firestore().collection('object').get();
// Creates an array of promises that can be awaited later
// You can use the docs property which is an array, and then you can use map on it
const promises = objectSnapshot.docs.map(async (objectDoc) => {
// This will execute in parallel but will create a promise and add it to promises
const valueSnapshot = await admin.firestore().collection('object').doc(objectDoc.id).collection('value').get();
return valueSnapshot.docs.map((valueDoc) => valueDoc.data());
});
// Wait for all promises created before returning
return await Promise.all(promises);
这是一个非常简单的例子。非常感谢。这是一个非常简单的例子。非常感谢。