Вы можете использовать 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 для ссылки на отдельный документ вместо переписывания запроса.
Надеюсь, это поможет!