【发布时间】:2020-05-31 13:42:23
【问题描述】:
我对 JS 和一般编程还很陌生,在尝试在我的异步函数中实现 try/catch 时遇到了以下问题。它看起来像这样:
(async function main() {
try {
await myFunc();
} catch (e) {
console.log(e)
}
setTimeout(main, 2000);
}) ();
如您所见,它通过 setTimeout 调用对其自身进行循环,使其无限...除非它捕获错误。自然,我想尝试在 e 的某些实例中重试 myFunc,但不知道如何在不删除 setTimeout 的情况下实现它(这里 2 秒的延迟很重要)。
我尝试使用标签:
let critErrCount;
(async function main() {
critErrCount = 0;
lbl:
try {
await myFunc();
} catch (e) {
if (e instanceof errType1) {
console.log(`errType1: ${e}`);
continue lbl;
} else if (e instanceof errType2) {
critErrCount += 1;
console.log(`errType2: ${e}`);
console.log(`critErrCount: ${critErrCount}`);
if (critErrCount == 5) {
console.log(`Too many critErrs, aborting...`)
process.exit;
}
continue lbl;
} else {
process.exit
}
}
setTimeout(main, 2000);
}) ();
当然,它没有用,因为据我所知,“继续”的行为不像其他语言中的“goto”,只能在适当的循环中工作(forEach、while、for 等)。由于由于 nodejs 运行时细节(显示为“非法继续语句”),catch 块内的 setTimeout 也不起作用,所以我没有想法。
【问题讨论】:
-
让它无限...除非它捕获错误。即使有错误,递归
setTimeout仍然可以工作,对吧? -
你为什么不用
setInterval? -
@CertainPerformance 这是正确的。但这里有一个问题:经过一些测试,我确定如果
main函数即使只捕获一次错误,它也会在几次(数量总是不同)迭代后由于未知原因自行终止。如果没有发现错误,它将继续按预期工作,直到发现一个错误 -
我很确定给定的代码不会导致你所说的。您可以将实时 sn-p 编辑到显示超时最终失败的问题中吗?我会认为它会一直有效
-
@fadeys.work
setInterval不考虑函数执行时间,我的目标是等待2000秒代码执行后
标签: javascript loops async-await try-catch settimeout