Если я правильно понимаю ваш код, вам не нужно использовать Promise.all()
, но вам нужно правильно связать различные Обещания, возвращаемые асинхронными методами Firestore.
Следующие действия должны помочь (непроверено) ):
export const replyCreated = functions
.firestore
.document(`/Reply/{replyId}`)
.onCreate((change: any, context: functions.EventContext) => {
return admin.firestore().doc(`Challenge/${change.data().challenge_id}`).update({ replyCount: admin.firestore.FieldValue.increment(1) })
.then(() => {
return admin.firestore()
.collection(`User`)
.where('following', 'array-contains', change.data().user_id).get()
})
.then((snapshot: any) => {
if (!snapshot.empty) {
const batch = admin.firestore().batch();
snapshot.forEach((doc: any) => {
const tempObject = doc.data()
console.log(`/Subscribed_Challenges/${tempObject.userId}/myChallenges/${change.data().challenge_id}`)
const myChallenge = admin.firestore().doc(`/Subscribed_Challenges/${tempObject.userId}/myChallenges/${change.data().challenge_id}`)
batch.update(myChallenge, { replyCount: admin.firestore.FieldValue.increment(1) })
})
return batch.commit()
}
else {
throw new Error('Snapshot empty')
}
})
.catch((err: any) => {
console.log('Error', err);
return null;
});
})
Вы бы использовали Promise.all()
, если вам нужно выполнить несколько асинхронных методов (которые возвращают Promise) параллельно. В вашем случае (если я не ошибаюсь) единственный случай, когда вам нужно выполнять асинхронные методы параллельно, находится в блоке, где вы используете пакетную запись, поэтому параллельное выполнение выполняется самой пакетной записью. Для других методов это скорее последовательное выполнение, и вы должны связать обещания с помощью метода then()
.