【问题标题】:Handling firestore tasks with Promises使用 Promises 处理 Firestore 任务
【发布时间】:2019-10-17 18:04:25
【问题描述】:

我是 Promises for Firestore 的新手。我必须运行这个任务:

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);
          });  

这是第一个问题。这项任务完成后应该会通知我。所以只有当集合中的所有文档都被删除时。我试着用一个承诺来处理这个问题。我不确定也许还有其他方法。提前致谢。

~菲利普

【问题讨论】:

    标签: javascript html collections promise google-cloud-firestore


    【解决方案1】:

    当所有delete() 操作都完成后,您可以使用Promise.all 返回Promise,您可以使用then()/catch() 来执行操作或处理错误。由于delete 返回Promise<void>,我们可以将每个删除操作推送到可以与Promise.all() 一起使用的promise 数组:

    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));
    

    另一个要考虑的选项是使用batched writes

    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 来引用单个文档来简单地删除,而不是重新编写查询。

    希望对您有所帮助!

    【讨论】:

    • Array.prototype.map.forEachpush 组合的替代品。
    • @AZ_ 默认情况下这不适用于QuerySnapshot,因为它在技术上不是一个数组,也没有像map() 这样的操作。
    • 哦不知道,谢谢。
    • 当你说“集合不退出”时,你的意思是外层get查询吗? get() 确实返回了一个承诺。您的意思是在外部then() 内部检查是否没有文件?也许您可以更新您的问题以反映您正在尝试做什么以获得进一步的帮助?
    猜你喜欢
    • 2013-03-10
    • 2017-01-11
    • 2014-05-27
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多