Облачная функция ожидания запроса БД - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть функция облачных графиков. В этом я хочу загрузить некоторые вещи из базы данных и изменить их.

Функция запущена, но я не могу дождаться, пока база данных.

Может, вы увидите ошибку и поможете мне ...

мой код

exports.notifysmall = functions.pubsub.schedule('0 15 * * *')
.timeZone('Europe/Berlin').onRun((context) => {
    const db = admin.firestore();
    console.log("#################START RUN################");
    db.collection("user").get().then((snapshot: any) => {
        snapshot.forEach((record: any) => {
            console.log(record.get("name"));
        });
        return true;
    }).catch((err: any) => {
        console.log("#################ERROR################");
    });
    console.log("#################END################");
    return true;
});

, что я хочу видеть в своем журнале:

#################START RUN################
user1
user2 
user3
#################END################

что я так на данный момент:

#################START RUN################
#################END################
user1
user2 
user3

почему это так?

С уважением и благодарностью за помощь Саймон

1 Ответ

0 голосов
/ 04 апреля 2020

Это потому, что метод get() является асинхронным и возвращает Обещание: console.log() s в методе then() выполняются только в том случае, если Обещание, возвращенное методом get(), выполнено, С другой стороны, строка, которая печатает END, выполняется немедленно и, следовательно, будет «всегда» предшествовать console.log() s в then().

. Кроме того, обратите внимание, что вы неправильно возвращаете Цепочка обещаний . Я бы посоветовал вам посмотреть 3 видео о "JavaScript Promises" из серии Firebase . Это КЛЮЧЕВОЙ пункт для облачных функций .

Поэтому вы должны сделать следующее:

exports.notifysmall = functions.pubsub.schedule('0 15 * * *')
.timeZone('Europe/Berlin').onRun((context) => {
    const db = admin.firestore();
    console.log("#################START RUN################");
    return db.collection("user").get()   //  <--- See the return 
    .then((snapshot: any) => {
        snapshot.forEach((record: any) => {
            console.log(record.get("name"));
        });
        console.log("#################END 1 ################");
        return true;
    }).catch((err: any) => {
        console.log("#################ERROR################");
        return true;
    });
    console.log("#################END 2 ################");
});

То, что вы должны увидеть с помощью приведенного выше кода, выглядит следующим образом: следует:

#################START RUN################
#################END 2 ################
user1
user2 
user3
#################END 1 ################

Строка, которая печатает END 1, будет выполнена после других console.log() с, как объяснено выше.

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