Обработка заданий пожарного магазина с помощью Promises - PullRequest
0 голосов
/ 17 октября 2019

Я новичок в Обещаниях для 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);
          });  

Вот первая проблема. Эта задача должна заметить меня, когда она закончится. Так что только если все документы в коллекции будут удалены. Я пытаюсь справиться с этим с обещанием. Я не уверен, может быть, есть другие способы. Заранее спасибо.

~ филип

1 Ответ

2 голосов
/ 17 октября 2019

Вы можете использовать Promise.all для возврата Promise, когда все действия delete() завершены, которые вы можете использовать с then() / catch() для выполнения действия или обработкиошибки. Поскольку delete возвращает Promise<void>, мы можем помещать каждое действие удаления в массив обещаний, которые мы можем использовать с 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 для ссылки на отдельный документ вместо переписывания запроса.

Надеюсь, это поможет!

...