所以我有这样一个请求
handleUpdate1 = async(req, res, next) {
await _asyncFuncWillRun10Minutes(req.body);
return res.status(200).end();
}
因此,如果客户端向该函数发出GET请求,客户端将等待大约10分钟以获得响应。
如果我将源更改为
handleUpdate2 =(req, res, next) {
_asyncFuncWillRun10Minutes(req.body);
return res.status(200).end();
}
请求将立即返回。
我的问题是第二个函数handleUpdate2
,执行会立即返回,_asyncFuncWillRun10Minutes
会发生什么?
它会一直运行到正常完成吗?我应该使用await
来等待它正常完成吗?
2条答案
按热度按时间von4xj4u1#
在某些情况下,在发出请求的异步函数中使用
await
可能是必要的。这完全取决于用例。如果您需要API的响应并使用它,则需要放置一个wait来停止进一步执行,直到获得响应为止。但如果您只想发出外部请求,而不需要结果,然后你可以跳过等待。它会给予你一个未解决的承诺,并继续进一步执行而不等待。使用异步函数发出HTTP请求时,该函数在等待服务器响应时不会阻止程序的执行,而是立即返回Promise对象,程序将继续执行。
在异步函数调用之前使用
await
将暂停函数的执行,直到Promise is resolved
为止。如果需要等待服务器的响应,然后再执行依赖于该响应的下一行代码,则此操作非常有用。但是,在某些情况下,可能不需要使用await。例如,如果您不需要立即使用响应数据,并且可以在等待响应的同时继续执行其余代码,则可以直接调用异步函数而不使用await。
总之,是否在发出请求的异步函数中使用await取决于您的特定用例,以及在继续执行其余代码之前是否需要等待响应数据。
vaqhlq812#
我的问题是第二个函数handleUpdate2,执行将立即返回,_asyncFuncWillRun10Minutes发生了什么?
假设您的服务器运行在一个正常的环境中,即服务器在请求之间保持运行(而不是一些特殊的无服务器环境),那么
_asyncFuncWillRun10Minutes
将运行到完成,并在您发送响应后很久才结束。它会一直运行到正常完成吗?我应该使用wait来等待直到它正常完成吗?
是的,它将一直运行到完成。如果您不需要知道它何时完成,则不需要使用
await
。但是......您必须捕获来自
_asyncFuncWillRun10Minutes
的拒绝,因此第二个代码块的最低要求如下:在发送响应之前不使用
await
的缺点是发出请求的客户端将无法知道异步操作是否遇到错误。如果这对您的特定情况来说不是问题,那么只需在内部捕获错误,handleUpdate2
将正常工作。免责声明。有一些运行时环境(通常称为无服务器),在您发送对请求的响应后,这些环境不会保持代码的活动状态。(通常以较低的成本),它们不会让您的服务器代码一直运行。它们只是处理传入的请求,并在请求完成后立即关闭。只要您不是在这些专门的环境中运行,你的
_asyncFuncWillRun10Minutes
代码将继续运行到完成就好了。