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

2024-04-22

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

  });

我认为问题在于该函数在完成 foreach 循环之前返回 0。

有针对这个的解决方法吗?

Thanks!


解决方案是等待所有异步update()在调用 return 之前要完成的操作:因为您使用forEach()循环,你需要使用Promise.all() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all为了等待循环中调用的所有异步操作完成后再返回它返回的 Promise。

正如文档(上面的链接)中所解释的,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)

    });

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

云函数在运行所有代码之前结束 的相关文章

随机推荐

  • 身份验证时 Firebase .getUID NullPointerException

    我注册时会将数据添加到数据库中 但是我得到了 Java lang NullPointerException 尝试在空对象引用上调用虚拟方法 java lang String com google firebase auth Firebase
  • 如何在vaadin中播放视频?

    我使用了两个视频组件 Video video new Video 并嵌入 Embedded embed new Embedded my video new ExternalResource yyy xxx mp4 embed setMime
  • 连接每第 n 行

    我在矩阵中得到了一个数据集 如下所示 从 Excel 导入 matrix Cat1 1 2 3 4 Cat2 9 10 11 12 Cat3 17 18 19 20 Cat1 5 6 7 8 Cat2 13 14 15 16 Cat3 21
  • java项目中在哪里编写和存储mongoDB的map/reduce函数

    对于在 Java 项目中的何处以及如何编写和存储 javascript map reduce 函数以便与 MongoDB 数据库一起使用 有人有任何建议或知道任何最佳实践吗 我正在寻找的标准是 在编写和编辑函数时 我希望受益于 IDE 提供
  • 在Microsoft Surface平台上使用WPF扩展器控件

    我正在尝试在表面应用程序中使用 Expander 控件 我看到它不是表面控件 因此应用程序编译并显示控件 但触点不起作用 无论如何 我可以修改接触事件并使其在表面应用程序中工作吗 为此 您所要做的就是更改Expander的模板使用 Surf
  • 如何在Python中的二值图像上使用kmeans聚类?

    我试图对两个不同的人采取二元面具 其他一切都是黑色的 现在我想使用将每个人分组到他们自己的集群中K means这样我最终就可以在它们周围绘制边界框 这是我到目前为止的代码 def kmeans img k values range 1 5
  • WPF 绑定 - 空字符串的默认值

    如果绑定字符串为空 是否有标准方法为 WPF 绑定设置默认值或后备值
  • 如何在cx_Oracle中使用Pandas Write_Frame将结果导出到Oracle数据库

    我正在尝试将 Pandas DataFrame 导出到 Oracle 数据库 我在 Pandas 中遇到了 Write Frame 函数 这听起来正是我所需要的 但是 我在网上进行了大量搜索 但无法使其发挥作用 我已经导入了 cx Orac
  • 在 Windows 上使用 OpenBLAS 安装 numpy 的教程

    拜托 我这里确实需要一盏灯 我想使用良好的 BLAS LAPACK 库安装 numpy在 Windows 上 但绝对没有页面足够好地解释该过程 看来 OpenBLAS 是一个又好又快的选择 目标是将 theano 与 keras 一起使用
  • 将下拉菜单添加到 ASP.Net Core Web 应用程序中的导航栏(引导程序)

    在 Visual Studio 中 我创建一个新的 ASP Net Core Web 应用程序 然后我添加一个下拉菜单 根据 Bootstrap 文档 https getbootstrap com docs 5 1 components n
  • 如何从Play缓存中获取对象(scala)

    如何从Play缓存中获取对象 scala 设置代码 play api cache Cache set mykey98 new Product 98 0 获取代码 val product1 Option Any play api cache
  • Twitter 推文后绑定事件 ( twttr.events.bind ) 不起作用

    我有这个简单的代码 应该提醒 我刚刚发推文 但似乎不起作用 我已经尝试了所有示例 甚至访问此链接寻求帮助https dev twitter com discussions 671 https dev twitter com discussi
  • 如何访问 ItemsControl 的子项?

    如果我有一个源自ItemsControl 我可以访问它的子集合 以便我可以循环它们来执行某些操作吗 我目前似乎找不到任何简单的方法 类似的解决方案Seb s https stackoverflow com a 1000438 3195477
  • 如何去掉 Matlab 单元格中的双引号?

    我在 Matlab 中有一个单元格数组 单元格中的所有元素都表示为 something 我怎样才能创建一个数组 something 这里有两个解决方案 strrep删除所有双引号实例 同时regexprep只删除字符串开头和结尾的双引号 感
  • 生成的 pdf 中的图像损坏了发送到服务器的 pdf

    我正在使用 jsPDF 在 Web 应用程序中创建 PDF 文档 将该文档发送到 Perl 并让 Perl 通过电子邮件发送它 效果很好 但是 当我将图像添加到 PDF 文档时 它不再起作用 因为 Adob e Reader 说该文件已损坏
  • WebSocket Stomp over SockJS - http 自定义标头

    我在 javascript 客户端中使用 stomp js 而不是 SockJS 我正在使用连接到 websocket stompClient connect function frame stomp over sockJS 连接有 2 个
  • 从节点树中获取总和

    我正在学习php 我有这个结构 company 1 10 all 50 company 1 1 10 all 20 company 1 1 1 10 all 10 company 1 2 20 all 20 每家公司可能有多个子公司 也可能
  • 切换div的可见性属性

    我的 div 中有一个 HTML 5 视频 然后我有一个自定义播放按钮 效果很好 我将视频的可见性设置为加载时隐藏 单击播放按钮时可见 再次单击播放按钮时如何将其恢复为隐藏 function showVid document getElem
  • 使用 linq 将数据集列表

    我有一个DataSet我想转换DataSet into List
  • 云函数在运行所有代码之前结束

    我正在尝试创建一个云函数 但它在 firebase 日志中 在执行所有任务之前显示 已完成 这是我的代码 export const count functions pubsub schedule 0 8 timeZone Europe Br