Облачная функция заканчивается перед запуском всего кода - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь создать облачную функцию, но она в журналах firebase показывает «готово» перед выполнением всех задач.

Это мой код.

  export const count = functions.pubsub
  .schedule('0 8 * * *')
  .timeZone('Europe/Brussels')
  .onRun(async context => {

     const snapshot =  await admin.database().ref('/counter').once('value');

     snapshot.forEach( (child) =>
{
    var info = child.val();
    var dayViews = info['count'];
    var ID = child.key;

        var ref1 = admin.database().ref('/counter/'+ID);
        ref1
        .update({
          "count": 0,
          "totalViews": dayViews,
        })
        .then(function() {
          console.log("Write completed")
        }).catch(function(error) {
          console.error("Write failed: "+error)
        });

    });
    return 0;

  });

Я думаю, что проблема в том, что функция возвращает 0 перед завершением для каждого l oop.

Есть ли решение для этого?

Спасибо!

1 Ответ

1 голос
/ 02 февраля 2020

Решение состоит в том, чтобы дождаться завершения всех асинхронных update() операций перед вызовом return: поскольку вы используете forEach() l oop, вам необходимо использовать Promise.all() для ждать завершения всех асинхронных операций, вызываемых в l oop, перед возвратом обещания, которое он возвращает.

Как объяснено в do c (ссылка выше), обычно используется Promise.all() " после запуска нескольких асинхронных задач для одновременного запуска и создания обещаний для их результатов, чтобы можно было дождаться завершения всех задач ".

Следующие действия должны помочь:

export const count = functions.pubsub
    .schedule('0 8 * * *')
    .timeZone('Europe/Brussels')
    .onRun(async context => {

        const snapshot = await admin.database().ref('/counter').once('value');

        const promises = [];

        snapshot.forEach((child) => {
            var info = child.val();
            var dayViews = info['count'];
            var ID = child.key;

            var ref1 = admin.database().ref('/counter/' + ID);

            promises.push(ref1
                .update({
                    "count": 0,
                    "totalViews": dayViews,
                }));
        });

        return Promise.all(promises)

    });

О том, почему важно правильно обрабатывать асинхронные операции в облачной функции, я бы посоветовал вам посмотреть 3 видео о "JavaScript Promises" из серии видеороликов Firebase: https://firebase.google.com/docs/functions/video-series/

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