Да, петля 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))
})