在Firebase Cloud Functions中完成功能后执行代码片段

时间:2019-01-30 11:04:07

标签: javascript typescript firebase google-cloud-firestore google-cloud-functions

在使用Firebase云功能时,我有点问题。下面的代码是将包含2个数组的对象写入Firestore DB的函数。部署函数后,将填充idf_words数组,并且idf_weight为空。

我尝试在for循环中放置一些日志消息,并发现query.get()在函数结束后执行。有没有办法让firestore等到query.get()完成?

export const updateCakeAndPastriesIDF = functions.firestore.document("TF/tf/Cake_and_Pastries/{itemCategory}")
    .onUpdate((change, context) => {
        const itemBefore = change.before.data();
        const itemAfter = change.after.data();

        if (itemAfter['tf_tf_score'] === itemBefore['tf_tf_score']){
            console.log('This TF score of the words in this item has not changed');
            return null;
        } else {
            console.log('This TF score of the words in this item has changed');
            const tfWords:string[] = itemAfter['tf_unique_words'];
            const tfItemUid:string = itemAfter['tf_item_uid'];
            const idfWords:string[] = [];
            const idfWeight: number[] = [];
            const db = admin.firestore().collection('TF').doc('tf').collection('Cake_and_Pastries');

            tfWords.forEach(function (tfword) {
                idfWords.push(tfword);
                const query = db.where("tf_unique_words", "array-contains", tfword);
                query.get().then(function (itemDoc) {
                    if (!itemDoc.empty){
                        const numberOfDocs = itemDoc.size;
                        console.log("For item: "+tfItemUid+", there are "+numberOfDocs+"Documents");

                        admin.firestore().collection('Number_of_Items')
                            .doc('Cake_and_Pastries')
                            .get()
                            .then(function (numberDoc){
                                const numberOfCakesAndPastries = numberDoc.data()['number_of_items_in_category'];
                                const idfOfWord = (Math.log(numberOfDocs/numberOfCakesAndPastries)+1);
                                idfWeight.push(idfOfWord);
                                console.log("Word IDF: "+idfOfWord);
                                console.log(idfWeight);
                            })
                    }else {
                        console.log("No such document!");
                    }
                })
            });

            console.log("IDF weight array outside of loop: "+idfWeight);

            admin.firestore()
                .collection('IDF')
                .doc('idf')
                .collection('Cake_and_Pastries')
                .doc(tfItemUid).set({
                idf_item_uid: tfItemUid,
                idf_words: idfWords,
                idf_weight: idfWeight
            });
        }
    });

0 个答案:

没有答案