Облачная функция Firestore - значение внешней переменной, не распознанной в .then () - PullRequest
0 голосов
/ 31 октября 2019

Я новичок в облачных функциях Firestore и пытаюсь запустить простую функцию, которая запускает onWrite () в одной коллекции и, основываясь на этом, обновляет значение в другой.

Я сталкиваюсь с препятствиями, где значениепеременная (фактически константный массив), не распознается внутри метода ... get (). then (snapshot) => {}. Как я понимаю, область видимости внешней переменной тоже должна быть внутри, не так ли? Что я делаю не так?

Исследования по этой теме привели меня к концепции Обещаний, и я попытался создать значения обещаний на основе get () и вернуть их, но также не смог сработать. Возможно, я использовал их неправильно, если это ответ, пожалуйста, поделитесь. Спасибо.

ОБНОВЛЕНИЕ: Я проверил, сохранив значение массива в переменной вне функции .then (), и попробовал еще раз, и он работает правильно. Кажется, проблема возникает с const myArray [].

Мой код ниже:

exports.mytestExport = functions.firestore
    .document('col/{docid}')
    .onWrite( (change, context) => {

        const docID = context.params.docid;
        const myArray = change.after.data().someArray;

        const db = admin.firestore();
        const newColRef = db.collection("newCollection");

        for(index = 0; index < myArray.length; index++) {
            console.log(myArray[index]);      //Value Prints here as expected.
            var myArrayValue = myArray[index];
            console.log(typeof(myArray[index])); // Output is 'string'

            let snapshot = newColRef.doc(myArray[index]).get()
                        .then((snapshot) => {

                            console.log(myArray[index]);  // This prints **'undefined'** for all the times 'for' loop is executed.
                            console.log(myArrayValue); // This prints Correctly!

                        if(snapshot.exists) {
                                //my code to update 'newCollection'
                            }
                        })
        }
        return 'success';
    })

Ваша помощь очень ценится! Спасибо,

1 Ответ

0 голосов
/ 01 ноября 2019

Как ответил @Doug Stevenson, причиной этого действительно является неправильное использование Promises.

Для тех, у кого есть подобные проблемы в будущем, опубликуйте мою реализацию ниже:

Поскольку естьнет никаких обещаний, что код должен ждать перед переходом к следующему шагу, цикл for

for(index = 0; index < myArray.length; index++) {

выполняется полностью, а значение индекса равно myArray.length (когда условие не выполняется).

Между тем команда get () все еще выполняется, и когда она выполняется, значение индекса выходит за пределы, и поэтому не может найти значение в массиве, что приводит к неопределенности. .

Простой способ, который я нашел без использования Promises, заключался в использовании «await» вместо цепочки моего кода (с .then ...). Например: * 10101

let snapshot = await newColRef.doc(myArray[index]).get()
if (snapshot.exists)....{}

Как только мне станет удобнее работать с цепочкой (.then..then ... catch ... response ()), я предпочитаю использовать ее вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...