javascript - 具有多个值的循环的 Firestore 查询
问题描述
我正在尝试使用字符串中保存的数据检索许多 Firestore 文档。这个想法是,对于数组中的每个值,我会使用 Firestore 查询来检索与该查询匹配的文档并将其推送到另一个数组。我在实现这一目标时遇到了一些问题。到目前为止,我已经尝试过:
exports.findMultipleItems = functions.https.onRequest((request, response) => {
var list = ["item1", "item2", "item3", "item4"];
var outputList = [];
for (var i = 0; i < list.length; i++) {
console.log("Current item: " + list[i]);
let queryRef = db.collection("items").where('listedItems', 'array-contains', list[i]).get()
.then(snapshot => {
if (snapshot.empty) {
console.log('No matching documents.');
}
snapshot.forEach(doc => {
outputList.push(doc.data());
});
return;
})
.catch(err => {
console.log('Error getting documents', err);
});
}
response.send(JSON.stringify(outputList));
});
我不完全确定,但我认为问题之一是 for 循环在查询有机会完成之前完成。
Ps - 这是使用 Admin SDK 通过 Cloud Functions 运行的。
解决方案
您queryRef
实际上不是参考。这是一个在你的 get/then/catch 完成后解决的承诺。您需要使用这些承诺来确定它们何时全部完成。只有在它们全部完成后才会填充数组,只有这样才能安全地使用该数组发送响应。
将所有的 Promise 收集到一个数组中,并使用 Promise.all() 获得一个新的 Promise,该 Promise 会在它们全部完成后解析:
exports.findMultipleItems = functions.https.onRequest((request, response) => {
var list = ["item1", "item2", "item3", "item4"];
var outputList = [];
const promises = [];
for (var i = 0; i < list.length; i++) {
console.log("Current item: " + list[i]);
let promise = db.collection("items").where('listedItems', 'array-contains', list[i]).get()
.then(snapshot => {
if (snapshot.empty) {
console.log('No matching documents.');
}
snapshot.forEach(doc => {
outputList.push(doc.data());
});
return;
})
.catch(err => {
console.log('Error getting documents', err);
});
promises.push(promise);
}
Promise.all(promises).then(() => {
response.send(JSON.stringify(outputList));
}
.catch(err => {
response.status(500);
})
});
您可能希望使用这些教程来更好地了解如何处理 Cloud Functions 中的 Promise:
推荐阅读
- python - Tensorflow 从索引创建新张量
- javascript - 在 Chrome 调试器中访问对象变量(VueJS 调试)
- python - 试图找到两个列表之间的差异,并将差异附加到第三个列表中,我的第三个列表是 Python 中的嵌套形式
- javascript - 如何在 React with Javascript 中使用“从 src/* 导入组件”导入所有组件、样式等?
- javascript - 如何修复 Electron.js 中的菜单和更改页面?
- ruby - ||= 和 |= 与布尔值有什么区别
- javascript - 如何在 Maven(Java)Project 中为 javascript 设置测试环境?
- node.js - 如何在 Puppeteer 中获取当前页面?
- python - BeautifulSoup - 在多个“表”上使用 find_all 时出现 AttributeError
- c# - 在c#中将自定义的单个字符串转换为JSON并根据条件构造最终的json