javascript - 使用 Promises 处理 Firestore 任务
问题描述
我是 Firestore 的 Promises 新手。我必须运行这个任务:
db.collection("users").doc(user_uid).collection("grades").doc("g").collection("es111").get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
db.collection("users").doc(user_uid).collection("grades").doc("g").collection("es111").doc(doc.id).delete();
});
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
这是第一个问题。这项任务完成后应该会通知我。所以只有当集合中的所有文档都被删除时。我试着用一个承诺来处理这个问题。我不确定也许还有其他方法。提前致谢。
~菲利普
解决方案
您可以使用Promise.allPromise
在所有操作完成时返回 a delete()
,您可以使用then()
/catch()
来执行操作或处理错误。当delete返回时Promise<void>
,我们可以将每个 delete 操作推送到我们可以使用的一组 Promise 中Promise.all()
:
function foo(user_uid) {
return db.collection("users").doc(user_uid).collection("grades").doc("g").collection("es111").get().then(function(querySnapshot) {
let promises = [];
querySnapshot.forEach(function(doc) {
// add each delete() promise to promises array
promises.push(db.collection("users").doc(user_uid).collection("grades").doc("g").collection("es111").doc(doc.id).delete());
// or more simply
// promises.push(doc.ref.delete());
});
return Promise.all(promises);
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
}
// ...
// usage
foo()
.then(() => console.log('Success!'))
.catch(err => console.error(err));
另一个要考虑的选择是使用批量写入:
db.collection("users").doc(user_uid).collection("grades").doc("g").collection("es111").get().then(function(querySnapshot) {
const batch = db.batch();
querySnapshot.forEach(function(doc) {
batch.delete(doc.ref);
});
return batch.commit();
})
.then(() => console.log('Batched delete completed!'));
看起来批量写入一次最多支持 500 个操作。请注意,您可以通过使用DocumentSnapshot.ref来引用单个文档而不是重新编写查询来简单地删除。
希望这会有所帮助!
推荐阅读
- time-complexity - 此函数的时间复杂度(类似的答案但一个是错误的)
- c# - 用 C# 制作我的第一个计算器,但我被困住了
- session - 使用 JavaScript 处理自动注销重定向的最佳实践
- python - 程序冻结在创建一个大型 numpy 数组
- javascript - 如何在 useReducer 开关案例中正确测试 if-else 条件?
- javascript - 如何按位置过滤我的搜索结果以及如何重新呈现?
- python - Python API调用授权返回401请求库对JSESSIONID/Cookie/ClientID的检索失败
- powershell - 如何在 PowerShell 中运行多行代码?
- apache-spark - 从火花3中的字符串中删除空格
- node.js - Angular 10 警告:入口点“devextreme-angular..”包含对模块的深度导入