首页 > 解决方案 > 使用 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);
          });  

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

~菲利普

标签: javascripthtmlcollectionspromisegoogle-cloud-firestore

解决方案


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

希望这会有所帮助!


推荐阅读