You need to enable JavaScript to run this app. JavaScript中如何在for循环内正确使用async await处理异步请求
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何在for循环内正确使用async await处理异步请求

问题根源

你遇到的数组长度随机问题是因为fetch是异步非阻塞API:你在循环中发起118个请求后立刻返回了空数组,此时大部分请求还没有收到服务端响应,只有部分先完成的请求会把数据push进数组,最终数组的长度完全取决于你打印时已经完成的请求数量,所以每次结果都是随机的。

修复方案

使用Promise.all等待所有异步请求全部完成后再统一返回结果,修复后的代码如下:

async function getElements() {
    const url = "https://neelpatel05.pythonanywhere.com/element/atomicnumber?atomicnumber=";
    const requestList = [];
    // 循环变量改用let避免异步回调的变量指向错误
    for(let i = 1; i <= 118; i++){
        const newurl = url + i;
        // 将所有请求的Promise存入数组
        requestList.push(
            fetch(newurl)
            .then(response => response.json())
            .then(data => data.symbol)
        );
    }
    // 等待所有请求完成,按发起顺序返回结果数组
    return Promise.all(requestList);
}

// 异步函数需要通过then或者await拿最终结果
getElements().then(elements => console.log(elements));
可选容错处理

如果需要兼容部分请求失败的场景,避免单个请求失败导致整个Promise.all rejected,可以对单个请求做错误捕获:

requestList.push(
    fetch(newurl)
    .then(response => response.json())
    .then(data => data.symbol)
    .catch(err => {
        console.log(`原子序数${i}的请求失败`, err);
        // 失败位置返回自定义占位值
        return null;
    })
);

内容的提问来源于stack exchange,提问作者Amey patil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 23:15:04