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

使用async/await和Promise.all调用多API时返回宝可梦列表无序求助

问题原因
  • 参数类型不匹配:现有for循环中你已经通过await files[i].json()获取到了解析完成的宝可梦数据对象,但process函数仍将传入值作为Promise调用.then(),导致逻辑无法触发,打印不生效。
  • 注释中的forEach写法由于不支持异步等待,process执行顺序由接口响应速度决定,会出现列表乱序问题。
修复方案

方案1:调整process入参类型,保持for循环写法

这种方式和你原有代码逻辑最接近,修改量最小:

(async function(){  
  try {
    const files = await Promise.all(arrForFetch);
    // Promise.all返回顺序和arrForFetch传入顺序完全一致,按顺序遍历即可保证有序
    for(let i = 0; i < files.length;  i++){
      const data = await files[i].json();
      process(data);
    }
  } catch (err) {
    console.log("tobie pizda ucziekaj")
  }
})();

// 直接接收解析完成的宝可梦数据对象
let process = (data) => {
  console.log(data.id);
  // 此处可添加渲染逻辑:data.name是宝可梦名称,data.sprites下的字段是对应图片地址
}

如果不想修改process的原有逻辑,也可以去掉for循环中的await,直接传入Promise对象:

// for循环内修改为
process(files[i].json())

方案2:统一解析所有数据后再处理,逻辑更清晰

一次性完成所有请求、解析操作后再批量处理数据,更容易维护:

(async function(){  
  try {
    // 等待所有接口返回
    const files = await Promise.all(arrForFetch);
    // 解析所有响应为JSON,顺序保持和初始请求数组一致
    const pokemonList = await Promise.all(files.map(file => file.json()));
    // 按顺序处理所有宝可梦数据,不会出现乱序
    pokemonList.forEach(data => process(data))
  } catch (err) {
    console.log("tobie pizda ucziekaj")
  }
})();

let process = (data) => {
  console.log(data.id, data.name);
  // 渲染列表逻辑
}
补充说明

Promise.all返回的结果顺序永远和传入的Promise数组顺序一致,和单个接口的响应速度无关,只要按返回数组的顺序处理数据,最终渲染的宝可梦列表就不会出现乱序问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:06:01