setInterval中使用Fetch API出现Uncaught (in promise) Error问题求助
问题分析
你遇到的Uncaught (in promise) Error错误,核心原因是setInterval的异步回调函数脱离了外层try/catch的作用域:
- setInterval的回调是独立执行的,外层try/catch无法捕获它内部抛出的错误
- 回调是async函数,抛出的错误会转化为Promise的reject状态,如果没有对应的catch处理,就会触发未捕获的Promise错误
修复方案
推荐用递归的setTimeout替代setInterval,这样能让整个异步流程处于外层try/catch的控制范围内,同时确保每次API调用完成后再等待1秒,避免setInterval可能导致的请求堆积问题。
修改后的代码:
function firstAPI() { return fetch(url); } function secondAPI(key) { return fetch(url); } async function dataFetch() { try { let firstAPIData = await firstAPI(); if (!firstAPIData?.ok) { throw Error(await firstAPIData.text()); // 这里要加await,因为text()返回Promise } let firstAPIResponse = await firstAPIData.json(); let i = 1; let flag = 0; // 定义递归的轮询函数 async function poll() { if (i >= 10) return; let secondAPIData = await secondAPI(firstAPIResponse.key); if (!secondAPIData.ok) { throw Error(await secondAPIData.text()); // 同样加await } let secondAPIResponse = await secondAPIData.json(); if (secondAPIResponse.status === 'COMPLETE') { flag = 1; } i++; if (flag === 1) { throw Error('error'); } // 递归调用,等待1秒后执行下一次轮询 setTimeout(poll, 1000); } // 启动轮询 await poll(); } catch (error) { console.log(error); } } dataFetch();
关键修改点
- 用递归
setTimeout替代setInterval,让异步流程处于同一个try/catch上下文 - 修正
firstAPIData.text()和secondAPIData.text()的调用:text()返回Promise,必须加await才能获取实际错误文本 - 把轮询逻辑封装成单独的async函数,通过
await poll()让外层try/catch能捕获内部抛出的错误
内容的提问来源于stack exchange,提问作者iRaviGuggilam
相关产品推荐
相关产品推荐

