Если вы вызываете некоторые асинхронные методы Firestore в своей облачной функции (например, get()
для CollectionReference
или update()
для DocumentReference
), вам просто нужноцепочка различных обещаний, возвращаемых этими методами.
Итак, основываясь на коде вашего вопроса, вы можете изменить его следующим образом:
const someDocRef
const someDocRef2
const someDocRef3
db.collection("someOtherCollection").get()
.then(results => {
results.forEach(result=> {
//do some work
})
return someDocRef.update(....);
})
.then(() => {
return db.collection("someOtherCollection2").get();
})
.then(results => {
results.forEach(result=> {
//do some work
})
return someDocRef2.update(....);
})
.then(() => {
return db.collection("someOtherCollection3").get();
})
.then(results => {
results.forEach(result=> {
//do some work
})
return someDocRef3.update(....);
})
.then(() => {
res.status(200).send("I waited for all the Queries AND the update operations inside the then blocks of queries to finish!");
})
Обратите внимание, что это будет работать, поскольку число someCollectionRefs
и someDocRefs
известно заранее.,Если у вас есть переменное число асинхронных операций для выполнения, вам нужно будет использовать метод Promise.all()
, как предложено в других ответах.
В случае, если 3 блока
db.collection("someOtherCollectionX").get()
.then(results => {
results.forEach(result=> {
//do some work
})
return someDocRefX.update(....);
})
может выполняться полностью отдельно (т.е. результаты каждого блока не влияют на другие блоки), вы можете распараллелить вызовы следующим образом:
const someDocRef
const someDocRef2
const someDocRef3
const p1 = db.collection("someOtherCollection").get()
.then(results => {
results.forEach(result=> {
//do some work
})
return someDocRef.update(....);
});
const p2 = db.collection("someOtherCollection2").get()
.then(results => {
results.forEach(result=> {
//do some work
})
return someDocRef2.update(....);
});
const p3 = db.collection("someOtherCollection3").get()
.then(results => {
results.forEach(result=> {
//do some work
})
return someDocRef3.update(....);
});
Promise.all([p1, p2, p3])
.then(() => {
res.status(200).send("I waited for all the Queries AND the update operations inside the then blocks of queries to finish!")
});