firebase 云函数在运行所有代码之前结束

hgqdbh6s  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(118)

我试图创建一个云函数,但在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;

  });

我认为问题是函数在完成for each循环之前返回0。
有什么办法解决这个问题吗?
谢谢!

toiithl6

toiithl61#

解决方案是在调用return之前等待所有异步update()操作完成:因为你使用了forEach()循环,所以你需要使用Promise.all()来等待循环中调用的所有异步操作完成,然后才能返回Promise。
正如文档(上面的链接)中所解释的那样,Promise.all()“通常在启动多个异步任务并发运行并为其结果创建promise之后使用,以便可以等待所有任务完成”。
下面的代码应该可以做到这一点:

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)

    });

关于为什么正确处理云函数中的异步操作是关键,我建议您观看Firebase视频系列中关于“JavaScript Promises”的3个视频:https://firebase.google.com/docs/functions/video-series/

相关问题