繁体   English   中英

Firebase 函数:发送响应后如何最好地等待解除阻塞的承诺?

[英]Firebase functions: how best to await unblocking promises after response is sent?

我在 Node 10 上的 Firebase 函数中使用 Express。我的问题是:如果我有大量 Promise 需要在函数终止之前完成,但我想发送响应执行此操作 ( res.status(200).send... ),我能做到的最好方法是什么?

到目前为止,我提出了两种方法,但都不是很好(而且我还没有尝试过“完成”方法,看看它是否有效):

  1. 对于每个路由器,添加一个finally...子句,等待累积的承诺。 这有一个主要的缺点,即在添加新路由器时很容易忘记这样做,或者如果路由器已经需要自己的 finally 子句,则可能会出现错误

  2. 使用节点流“完成”事件, https ://nodejs.org/docs/latest-v10.x/api/stream.html#stream_event_finish ...但我不知道 Firebase 函数是否允许捕获此事件,或者如果我的函数运行到最后并且事件随后被触发,它仍然会被捕获。

我这样做是为了让我的函数响应更快。 谢谢你的帮助。

如果我需要在函数终止之前完成大量的 Promise,但我想在发送响应 (res.status(200).send...) 之后执行此操作,那么最好的方法是什么?

使用 Cloud Functions,不可能在承诺解决之前发送响应,并让这些承诺的工作正常完成。 当您发送响应时,Cloud Functions 假定这是该函数将执行的最后一件事。 当使用res.send()发送响应时,Cloud Functions 将终止该函数并关闭代码。 任何未完成的异步工作可能永远不会完成。

如果您想在发送响应后继续工作,您必须首先将该工作卸载到不在该功能的关键路径中的某个其他组件或服务。 一种选择是向pubsub 函数发送消息,并让该函数在“后台”完成,同时第一个函数发送响应并终止。 您还可以将消息发送到其他服务,例如 App Engine 或 Compute Engine,甚至可以在其他云中启动工作以异步完成。

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM