我在 Node 10 上的 Firebase 函数中使用 Express。我的问题是:如果我有大量 Promise 需要在函数终止之前完成,但我想在之后执行此操作我发送了响应 (res.status(200).send...
),我能做到这一点的最佳方法是什么?
到目前为止,我已经提出了两种方法,但似乎都不是很好(而且我还没有尝试“完成”方法来看看它是否有效):
对于每个路由器,添加一个等待累积 promise 的
finally...
子句。这样做的主要缺点是,在添加新路由器时很容易忘记执行此操作,或者如果路由器已经需要自己的finally子句,则可能会出现错误使用 Node 流“完成”事件,https://nodejs.org/docs/latest-v10.x/api/stream.html#stream_event_finish ...但我不知道 Firebase 函数是否允许捕获此事件,或者如果我的函数运行到结束并随后触发事件,它是否仍然会被捕获。
我这样做是为了让我的函数响应更快。感谢您的帮助。
最佳答案
if I have heavy Promises that I need to complete before the function terminates, but I want to do this after I sent the response (res.status(200).send...), how is the best way I could do this?
使用 Cloud Functions,无法在 promise 解决之前发送响应,也无法正常完成这些 promise 的工作。当您发送响应时,Cloud Functions 假定这是该函数要做的最后一件事。当使用 res.send()
发送响应时,Cloud Functions 将终止该函数并关闭代码。任何不完整的异步工作可能永远不会完成。
如果您想在发送响应后继续工作,则必须首先将该工作卸载到不在功能关键路径中的其他组件或服务。一种选择是将消息发送到 pubsub function ,并让该函数在“后台”完成,而第一个函数发送响应并终止。您还可以向其他服务(例如 App Engine 或 Compute Engine)发送消息,甚至可以在其他云中启动工作以异步完成。
另请参阅:
关于node.js - Firebase 函数 : how best to await unblocking promises after response is sent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63581753/