我的代码如下所示:
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通过链接所有异步操作并返回一个promise。然而,问题在于这种方法,我不想等待那些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吗?
答案 0 :(得分:2)
如果你的函数在没有等待所有承诺完成的情况下返回,那么它们很有可能在它们完成之前全部关闭。
如果您需要更多时间来执行函数中的工作,请在项目的Cloud console中增加其超时时间max is 9 minutes。如果你需要超过9分钟,你应该分开你的工作并使用发布/子触发器启动它们。
答案 1 :(得分:0)
我的理解是res.send()
将立即发送HTTP响应,而不会停止脚本执行。该脚本的执行仅取决于函数的超时配置值。
无论如何,您不应该发送多个HTTP响应,因此,如果在脚本结束之前发送响应,则需要实现某种其他方式来报告失败。例如通知。