javascript - 如何解决 Firebase 函数中的嵌套异步数据库调用
问题描述
我想获取一个对象列表,对于每个对象,另一个集合中都有一条记录,也必须调用它。两个请求都返回承诺,我的问题是,如何在下一个外部承诺完成之前“等待”内部承诺得到履行。
这是代码:
export async function getAllCompanies(req: Request, res: Response) {
try {
const listCompanies = await db.collection('companies').get()
const companies = listCompanies.docs.map(async doc => {
const data = doc.data()
const location = await db.collection('locations').doc(data.locationId).get()
const locationData = location.data()
return {
id: doc.id,
name: data.name,
address: locationData ? locationData.address : null,
zipCode: locationData ? locationData.zipCode : null,
city: locationData ? locationData.city : null,
country: locationData ? locationData.country : null,
email: data.email,
phoneNumber: data.phoneNumber,
type: data.type,
createTime: doc.createTime.toDate(),
lastUpdateTime: data.lastUpdateTime
}
})
return res.status(200).send({ companies })
} catch (err) {
return handleError(res, err)
}
}
解决方案
我想你正在寻找:
const resolvedCompanies = await Promise.all(companies);
return res.status(200).send({companies: resolvedCompanies});
就在return res.status(...)
. 这将等待您map
在公司列表中解决的所有承诺,然后再返回并返回值而不是承诺。
推荐阅读
- php - 我可以使用 htredirect 在同一个文件夹中建立索引吗?
- powershell - Powershell -replace 当替换字符串包含 $+
- azure-iot-edge - IoT Edge 离线数据存储解码 .log 数据文件
- r - 使用 lubridate::month() 编写向量化函数以生成财政年度
- oauth-2.0 - Open ID Connect 验证代码流程中的客户端应用程序到底是谁/什么?
- google-app-engine - 什么原因导致“请求在等待太长时间以尝试为您的请求提供服务后被中止”?
- c++ - C++计算器,不能自己除0
- python - 检查Numpy数组中的数字组?
- python-3.x - 在 pytorch 中追溯已弃用的警告
- esp8266 - ESP32作为主控制器,ESP8266作为客户端