#javascript #firebase #google-cloud-firestore #google-cloud-functions
# #javascript #огневая база #google-облако-firestore #google-cloud-функции
Вопрос:
У меня есть эта простая функция, которая, кажется, успешно выдает, что документ был удален, но я все еще вижу список документов в моих боях.
Что я делаю не так?
exports.removeOldBattles = functions.https.onRequest((req, res) => {
var coll = db.collection("Battles");
coll.get().then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
var battleId = doc.id;
coll.doc(battleId).delete().then(function () {
console.log("Document successfully deleted!");
res.status(200).send("Document successfully deleted!");
}).catch(function (error) {
console.error("Error removing document: ", error);
res.status(500).send(error);
});
});
});
});
Ответ №1:
Этот код отправляет ответ сразу после удаления первого документа. Он не ждет отправки ответа после того, как все было сделано. Облачные функции завершат работу функции почти сразу после отправки ответа (при вызове res.send()
), поэтому, скорее всего, она не завершит всю асинхронную работу.
Вместо этого вы должны отправлять ответ только после того, как все документы будут полностью удалены. Это означает, что вам придется обращать внимание на каждое из обещаний, возвращаемых каждым вызовом delete()
. Соберите их все в массив и используйте Promise.all()
, чтобы дождаться их полного завершения перед отправкой ответа.
const promises = [];
querySnapshot.forEach(function (doc) {
var battleId = doc.id;
const promise = coll.doc(battleId).delete();
promises.push(promise);
})
Promise.all(promises).then(() => {
res.status(200).send("Documents successfully deleted!");
});