Фрагмент кода выполняется после завершения функции в Firebase Cloud Functions - PullRequest
0 голосов
/ 30 января 2019

У меня небольшая проблема с использованием облачных функций Firebase.Код ниже - это функция, которая записывает в базу данных Firestore объект, содержащий 2 массива.После развертывания функции заполняется массив 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
            });
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...