Пакетное обновление облачной пожарной базы - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь использовать пакетное обновление для обновления счетчика в каждом снимке. Но похоже, что функция даже не работает. Я знаю, что это как-то связано со вторым обещанием, но я не уверен, где.

  import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

export const replyCreated = functions
    .firestore
    .document(`/Reply/{replyId}`)
    .onCreate((change: any, context: functions.EventContext) => {
        const promises = [];
        promises.push(admin.firestore().doc(`Challenge/${change.data().challenge_id}`).update({replyCount: admin.firestore.FieldValue.increment(1)}))

        promises.push(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().catch((err: any) => {
                        console.log('Batch Error', err)
                    });
                }
                else {
                    return Promise.resolve()
                }
            }))

        return Promise.all(promises)
            .then(() => {
                return "upvote complete";
            })
    })

1 Ответ

2 голосов
/ 21 января 2020

Если я правильно понимаю ваш код, вам не нужно использовать 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().

...