You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:43:26