【问题标题】:The correct way of starting off functions on Firebase Cloud Functions while not waiting for them to return在 Firebase Cloud Functions 上启动函数而不等待它们返回的正确方法
【发布时间】:2018-05-16 04:55:26
【问题描述】:

我的代码如下所示:

exports.onRecordCreated = functions.database.ref('/' + postsFireRealtimeRef + '/{someId}')
    .onCreate((snap, context) => {
        return someFunctionReturningAPromise(someParameter);
    }).then(someParameter => {
        return someFunctionReturningAPromise(someParameter);
    }).then(someParameter => {
        return someFunctionReturningAPromise(someParameter);
    }).then(someParameter => {
        return someFunctionReturningAPromise(someParameter);
    });

我相信这个实现遵循developer guide,通过链接所有异步操作并返回一个承诺。但是,问题在于这种方法,我不想等待那些 someFunctionReturningAPromise(..) 函数完成(主要是因为它们花费的时间太长,而且我有一个用户要在前端的流程中返回)。我宁愿在他们的路上发送这些函数来做他们的事情并返回一个已解决的承诺。

所以我会这样做:

exports.onRecordCreated = functions.database.ref('/' + postsFireRealtimeRef + '/{someId}')
    .onCreate((snap, context) => {
        doWork();
        return true  // Tell front end that the server was reached ok with the record being created, but don't wait for all asynchronous operations to complete
    });

function doWork() {
    return someFunctionReturningAPromise(someParameter)
        .then(someParameter => {
            return someFunctionReturningAPromise(someParameter);
        }).then(someParameter => {
            return someFunctionReturningAPromise(someParameter);
        }).then(someParameter => {
            return someFunctionReturningAPromise(someParameter);
        });
}

使用此解决方案我担心 Firebase 实例会关闭我的“流氓”功能。我不知道我是否可以保证 doWork() 函数将被允许运行,根据 Firebase:

通过正确终止函数...可以确保云 运行您的函数的函数实例之前不会关闭 您的函数成功地达到其终止条件或状态。

在 Firebase 云上运行此类独立功能的正确方法是什么?我应该将doWork() 包装在单独的HTTP function 中吗?

【问题讨论】:

    标签: node.js firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    如果您的函数在没有等待其所有承诺完成的情况下返回,那么很有可能它会在完成之前全部关闭。

    如果您需要更多时间来执行函数中的工作,请在 Cloud console 中为您的项目增加其超时时间,max is 9 minutes。如果您需要超过 9 分钟,您应该分开工作并使用 pub/sub 触发器开始工作。

    【讨论】:

      【解决方案2】:

      我的理解是res.send() 将立即发送 HTTP 响应而不会停止您的脚本执行。此脚本执行仅取决于函数的超时配置值。

      无论如何,您不应该发送多个 HTTP 响应,因此,如果您在脚本结束之前发送响应,则需要实现一些其他方式来报告失败。例如通知。

      【讨论】:

        猜你喜欢
        • 2021-05-16
        • 2019-09-17
        • 2022-07-28
        • 2012-06-27
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 2019-07-24
        • 1970-01-01
        相关资源
        最近更新 更多