当前位置: 首页 > 知识库问答 >
问题:

如何在云函数中的循环中设置等待表达式?

仲孙雅达
2023-03-14

以下是我Firebase云函数的简化代码:

const admin = require("../utilities/firebase_admin_init")
const db = admin.firestore()

exports.cronDeactivatingExpiredEvents = functions.https.onRequest(async (request,response) => {


    const now = new Date()
    const oneMonthAgo = moment().subtract(1,"month").toDate()


    try {
        const expiredEventsSnapshot = await eventRef
        .where("isActive","==",true)
        .where("hasBeenApproved","==",true)
        .where("dateTimeStart",">",oneMonthAgo)
        .where("dateTimeStart","<",now)
        .get()


        const expiredEventIDs = [] // list of IDs here ....


        // prepare promises to delete event data in user 'attendedEvents' subcollection.
        const deleteAttendedEventsDataPromises = []

        for (const eventID of expiredEventIDs) { 

            const eventAttendeeSnapshot = await db.collection("events").doc(eventID).collection("Attendee").get()
            const attendeeDocuments = eventAttendeeSnapshot.docs

            // getting all attendeeIDs.
            const attendeeIDs = []

            attendeeDocuments.forEach( attendeeSnapshot => {
                const attendee = attendeeSnapshot.data()
                attendeeIDs.push(attendee.uid)
            })

            attendeeIDs.forEach( attendeeID => {
                const p = db.collection("users").doc(attendeeID).collection("attendedEvents").doc(eventID).delete()
                deleteAttendedEventsDataPromises.push(p)
            })

        }

        // delete event data in user 'attendedEvents' subcollection
        await Promise.all(deleteAttendedEventsDataPromises)
        console.log(`successfully delete all events data in all attendee user subcollection`)


        response.status(200).send(`sucess`)

    } catch (error) {
        response.status(500).send(error)
    }



})

如上所述,循环中有一个等待表达式,但我有一个错误标记,如下图所示,因此我未能部署该函数:

这是我运行firebase部署后出现的错误

/Users/muchammadagunglaksana/Documents/kumpul_muslim/cloud_functions_serverless_backend/functions/service/cron_operations.js140:43错误在循环无等待循环内等待错误170:41错误在循环无等待循环内等待错误

✖2个问题(2个错误,0个警告)

NPM ERR!代码ELIFECYCLE npm ERR!ERRNO 1 npm ERR!函数@lint:eslint.npm ERR!退出状态1 npm ERR!NPM ERR!失败在函数@lint脚本. npm ERR!这可能不是npm的问题。上面可能有额外的日志输出。

NPM ERR!此运行的完整日志可以在npm ERR中找到!
/Users/muchammadagunglaksana/.npm/_logs/2019-12-14T10_47_36_788Z-debug.log

错误:函数预部署错误:命令以非零退出代码1终止

我试图从这里阅读一些解决方案使用async/wait和foreach循环。像这样使用for wait

的确,红色的错误标记将出现,但我仍然未能部署该函数。这是我运行firebase部署后出现的错误

函数[cronDeactivatingExpiredEvents(us-central1)]:部署错误。加载用户代码时函数失败。错误消息:文件索引中的代码。无法加载js。您的代码中有语法错误吗?详细堆栈跟踪:/srv/service/cron\u操作。js:138表示等待(AlgolianObjectId的常量eventID){//AlgolianObjectId与过期的eventID相同^^^^^

SyntaxError:对象的createScript(vm.js:80:10)处出现意外保留字。在模块上运行InthisContext(vm.js:139:10)_在对象处编译(module.js:617:28)。模块_扩展。。js(module.js:664:10)在模块中。在函数tryModuleLoad(module.js:506:12)处加载(module.js:566:32)。模块_在模块处加载(module.js:498:3)。require(module.js:597:17)at require(internal/module.js:11:18)at对象。(/srv/index.js:2:24)

在里面埃斯林特雷克。我使用的json:

"parserOptions": {
    // Required for certain syntax usages
    "ecmaVersion": 2018
  },

我是云功能和后端开发方面的新手。如果我的问题太基本,我很抱歉。

那我该怎么办?


共有1个答案

蒋嘉实
2023-03-14

第一个错误是关于eslint有一条规则no await in loop,它不允许在循环中等待,因为操作基本上是串行的,而不是并行的,以减少资源和时间的浪费。

你可以做的是,要么像你推动promise那样使用它,然后做promise。全部,或者您可以仅禁用该部分的规则。

/* eslint-disable no-await-in-loop */
for (const eventID of expiredEventIDs) { 

        const eventAttendeeSnapshot = await db.collection("events").doc(eventID).collection("Attendee").get()
        const attendeeDocuments = eventAttendeeSnapshot.docs
        ....
        ....
    }
/* eslint-enable no-await-in-loop */

第二个错误意味着您忘记在一个异步函数包装器中包装for-wait-of,或者您使用的是Node版本

 类似资料:
  • 我试图制作一个简单的应用程序来学习c(Visual Studio)中的一些东西。现在我正在制作一个音乐播放器,其中一个动作是在按钮点击事件中淡出音乐。 我对构建淡出部分没有问题,我做了一个while循环,每次循环运行时都将音量降低1%。此外,我还使用淡入度值更新标签。 唯一的问题是,为了减缓褪色,我正在使用线程。睡眠事件,该部分将冻结我的应用程序,并阻止使用淡入淡出值对我的文本标签进行任何更新。

  • 我试图使一个JSON调用异步/等待使用云函数为Firebase。 你知道如何修复下面的代码吗?我的计划失败了。 我的灵感是https://www.valentinog.com/blog/http-requests-node-js-async-await/ 部署误差 函数[setDetails]:部署错误。 异步URL SyntaxError:对象的createScript(vm.js:56:10)

  • 我试图用Firebase函数做一个理论上相对简单的函数。 具体地说: > 向所有用户的实时数据库变量添加 向所有用户发送通知 我仍然在努力理解/,这可能就是为什么我在这个问题上如此纠结的原因。 我正在做的是: 然后就有了: 和函数: 我当前得到的错误是: “Await”表达式仅允许在异步函数中使用。 const devices=await devicesref.get(); 但即使我得到它没有错误

  • 我有一个endpoint生成一些数据(需要一些时间),另一个endpoint可以用来获取生成的数据。我用wait调用第一个,从响应中获取id,并想调用第二个,而它的状态不是“Success”(它表示响应中准备和存储的数据),并继续我的脚本。 这是我的代码 它的工作,但我赢得了这么多的请求,我如何设置一些请求的间隔?我尝试使用await setInterval(),但是代码继续执行,没有等待结果 e

  • 我想用函数循环我的代码,但我不知道怎么做。我想循环直到用户说停止。我的输出也有问题,当调用函数。我对C++还是个新手。感谢任何帮助! 我计划我的输出是这样的:欢迎来到和谐礼品店-(用户名) 您已购买:(说明1)类别:(说明2)您应支付:(总价) 代码:

  • 我有一个控制器类,它需要为列表中的每个项目执行各种异步操作: 对于每个A 播放音频并等待完成 等t秒 对于A的每个子部分B: 播放音频并等待 等待t2秒 当我的方法被激发。我试着回复听众: 但最后我还是无法摆脱内部循环,这让我觉得整个想法都行不通。我已经查看了未来的界面,但这似乎也不是我想要的。 我知道我可以用一堆变量来解决这个问题,以跟踪我在状态流中的位置,但是带有一些框架的循环会更干净。谢谢: