javascript - 在响应错误之前重试 async/await try 和 catch block 3 次

标签 javascript node.js express async-await

发现类似的问题,但没有一个回答我的问题。我需要在抛出错误之前尝试运行异步函数三次。目前正在用 while 循环来做这件事,一开始就感觉不对。这一切都发生在快速路线上。这就是我的代码当前的样子:

const MAX_NUMBER_OF_TRIES = 3
router.post('/', async function (req, res) {
  let tries = 0
  while (true) {
    try {
      await myAsyncFunction(body)
      res.json({ success: true, message: 'Done!' })
    } catch (err) {
      if (tries >= MAX_NUMBER_OF_TRIES) {
        res.json({ success: false, message: err && err.message })
      }
    }
    tries++
  }
}

问题之一是,当我这样做时,我总是收到以下错误:

UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

如果没有循环,这不会出现。 所以我想问题是,在响应错误之前如何将这些调用限制为三次?这是正确的路径还是有其他方法可以做到这一点?为什么我会遇到标题问题?

最佳答案

是的,那个 while 循环看起来很粗略。你永远不会阻止它。只需使用普通循环即可。另外,当您收到响应时,您需要中断。

const MAX_NUMBER_OF_TRIES = 3
router.post('/', async function (req, res) {
  var message;
  for (let tries = 0; tries < MAX_NUMBER_OF_TRIES; tries++) {
    try {
      await myAsyncFunction(body)
      res.json({ success: true, message: 'Done!' })
      return
//    ^^^^^^
    } catch (err) {
      message = err && err.message;
      console.log(`Try ${tries}: ${err}`)
    }
  }
  res.json({ success: false, message })
}
<小时/>

这种奇怪的控制流的替代方法是使用递归,它非常适合重试:

async function getResult(body, retries) {
  try {
    await myAsyncFunction(body)
    return {success: true, message: 'Done'}
  } catch(err) {
    if (retries > 0)
      return getResult(body, retries-1)
    else
      return {success: false, message: err && err.message}
  }
}

const MAX_NUMBER_OF_TRIES = 3
router.post('/', async function (req, res) {
  const RETRIES = MAX_NUMBER_OF_TRIES - 1
  res.json(await getResult(body, RETRIES))
})

关于javascript - 在响应错误之前重试 async/await try 和 catch block 3 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55224038/

相关文章:

javascript - 仅使用 CSS 关闭菜单

node.js - Heroku:如何部署客户端和服务器在不同端口上运行的 Node 应用程序?

javascript - 查询 mongoose 来执行连接

javascript - 基本 Vue 帮助 : Accessing JS object values in component

javascript - 使用 RapaelJS 放大/缩小逻辑

javascript - 调整 Google Sheets API Node.js 快速入门以使用我自己的工作表,错误 : Error: Unable to parse range: Class Data! A2:E

ios - 按下安装后 iOS 配置文件返回什么类型的响应

node.js - 我如何使用仅具有 Apollo Server 2 graphql 端点的快速中间件

javascript - geoJson 坐标的 Mongoose 模式

javascript - 绘制半径增加的圆弧?