gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:54:51 25 4
gpt4 key购买 nike

发现类似的问题,但没有一个回答我的问题。我需要在抛出错误之前尝试运行异步函数三次。目前正在用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com