提问者:小点点

Firebase功能:在发送响应后,如何最好地等待解除阻塞的promise?


我在节点10上的Firebase函数中使用Express。我的问题是:如果我需要在函数终止之前完成沉重的承诺,但我想在发送响应(res.status(200).send.。。)之后完成,那么我可以这样做的最佳方式是什么?

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

>

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

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

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


  • 共1个答案

    匿名用户

    如果我需要在函数终止之前完成沉重的承诺,但我想在发送响应之后再这样做(res.status(200).send.。。),我可以这样做的最佳方式是什么?

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

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

    另请参阅:

    • 发送响应后继续执行(Firebase的云函数)
    • 如何在Firebase CloudFunctions上的express server中执行res.send()之后的代码