首页 > 解决方案 > 在 Firebase Cloud Functions 上启动函数而不等待它们返回的正确方法

问题描述

我的代码如下所示:

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);
    });

我相信这个实现遵循开发者指南,链接所有异步操作并返回一个承诺。但是,问题在于这种方法,我不想等待这些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 实例会关闭我的“流氓”功能。根据 Firebase 的说法,我不知道是否可以保证该doWork()函数可以运行:

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

在 Firebase 云之上运行这些独立功能的正确方法是什么?我应该包装doWork()一个单独的HTTP 函数吗?

标签: node.jsfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


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

如果您需要更多时间来执行函数中的工作,请在云控制台中为您的项目增加其超时时间,最长为 9 分钟。如果您需要超过 9 分钟,您应该拆分您的工作并使用 pub/sub 触发器启动它们。


推荐阅读