Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript Firebase函数:是否有方法异步迭代多个集合?_Typescript_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Typescript Firebase函数:是否有方法异步迭代多个集合?

Typescript Firebase函数:是否有方法异步迭代多个集合?,typescript,firebase,google-cloud-firestore,google-cloud-functions,Typescript,Firebase,Google Cloud Firestore,Google Cloud Functions,编写API时,我希望收集对象的集合并提取它们的每个属性。一个属性是每个对象内的集合。但是,似乎不支持异步迭代 伪代码(使用TypeScript): 以下代码不等待填充对象,并且不返回任何内容 有什么建议吗?您在这里犯的错误是,您传递给forEach的回调不应标记为async。所有异步函数立即返回一个承诺,该承诺在函数中所有其他等待的异步工作完成时解析。这意味着forEach将在不等待解决的情况下迅速兑现所有这些承诺。迭代完成后,每个回调中的异步工作将完成。这并不是您真正想要使用forEach的方

编写API时,我希望收集对象的集合并提取它们的每个属性。一个属性是每个对象内的集合。但是,
似乎不支持异步迭代

伪代码(使用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);

这是一个非常简单的例子。非常感谢。这是一个非常简单的例子。非常感谢。