NodeJS 在请求中等待长时间运行异步函数是必要的吗?

7cwmlq89  于 2023-03-12  发布在  Node.js
关注(0)|答案(2)|浏览(159)

所以我有这样一个请求

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来等待它正常完成吗?

von4xj4u

von4xj4u1#

在某些情况下,在发出请求的异步函数中使用await可能是必要的。这完全取决于用例。如果您需要API的响应并使用它,则需要放置一个wait来停止进一步执行,直到获得响应为止。但如果您只想发出外部请求,而不需要结果,然后你可以跳过等待。它会给予你一个未解决的承诺,并继续进一步执行而不等待。
使用异步函数发出HTTP请求时,该函数在等待服务器响应时不会阻止程序的执行,而是立即返回Promise对象,程序将继续执行。
在异步函数调用之前使用await将暂停函数的执行,直到Promise is resolved为止。如果需要等待服务器的响应,然后再执行依赖于该响应的下一行代码,则此操作非常有用。
但是,在某些情况下,可能不需要使用await。例如,如果您不需要立即使用响应数据,并且可以在等待响应的同时继续执行其余代码,则可以直接调用异步函数而不使用await。
总之,是否在发出请求的异步函数中使用await取决于您的特定用例,以及在继续执行其余代码之前是否需要等待响应数据。

vaqhlq81

vaqhlq812#

我的问题是第二个函数handleUpdate2,执行将立即返回,_asyncFuncWillRun10Minutes发生了什么?
假设您的服务器运行在一个正常的环境中,即服务器在请求之间保持运行(而不是一些特殊的无服务器环境),那么_asyncFuncWillRun10Minutes将运行到完成,并在您发送响应后很久才结束。
它会一直运行到正常完成吗?我应该使用wait来等待直到它正常完成吗?
是的,它将一直运行到完成。如果您不需要知道它何时完成,则不需要使用await
但是......您必须捕获来自_asyncFuncWillRun10Minutes的拒绝,因此第二个代码块的最低要求如下:

handleUpdate2 =(req, res, next) {
  _asyncFuncWillRun10Minutes(req.body).catch(err => {
       console.log(err);
  });
  return res.status(200).end();
}

在发送响应之前不使用await的缺点是发出请求的客户端将无法知道异步操作是否遇到错误。如果这对您的特定情况来说不是问题,那么只需在内部捕获错误,handleUpdate2将正常工作。
免责声明。有一些运行时环境(通常称为无服务器),在您发送对请求的响应后,这些环境不会保持代码的活动状态。(通常以较低的成本),它们不会让您的服务器代码一直运行。它们只是处理传入的请求,并在请求完成后立即关闭。只要您不是在这些专门的环境中运行,你的_asyncFuncWillRun10Minutes代码将继续运行到完成就好了。

相关问题