JS调用PokeAPI仅获取name和url 无法拿到宝可梦类型怎么办
问题描述
需要获取PokeAPI返回JSON数据中的宝可梦类型(Pokémon types)字段,但当前编写的JavaScript请求代码运行后,仅能获取到每个宝可梦对应的name和url属性,无法定位代码错误。
原有实现代码如下:
const baseUrl = 'https://pokeapi.co/api/v2/pokemon/?limit=3000' try { fetch(baseUrl) .then(response => { const responseJson = response.json() return responseJson }) .then(data => { const pokemons = data.results pokemons.forEach(pokemon => { console.log(pokemon); }) }) .catch(error => { console.error(error) }) } catch (error) { console.error(error) }
运行结果:
问题根因
当前请求的是PokeAPI的宝可梦列表分页接口,该接口的results字段设计上仅返回每个宝可梦的名称、详情接口地址两个属性,不会直接返回宝可梦类型、基础数值等详细信息,宝可梦类型字段存储在每个宝可梦对应的单独详情接口返回结果中,直接遍历列表结果自然拿不到types字段。
修复方案
需要遍历列表中每个宝可梦的url字段,二次请求详情接口后再提取types字段,参考实现如下:
const baseUrl = 'https://pokeapi.co/api/v2/pokemon/?limit=3000' // 封装单个宝可梦详情请求 async function getPokemonDetail(pokemon) { const res = await fetch(pokemon.url) const detail = await res.json() return { name: pokemon.name, types: detail.types // 目标宝可梦类型字段 } } async function fetchAllPokemonWithTypes() { try { const listRes = await fetch(baseUrl) const listData = await listRes.json() // 并发请求所有宝可梦详情 const pokemonList = await Promise.all(listData.results.map(getPokemonDetail)) console.log('携带类型字段的宝可梦列表:', pokemonList) } catch (error) { console.error('请求出错:', error) } } fetchAllPokemonWithTypes()
注意事项
- 一次性请求3000个宝可梦详情会产生大量并发请求,容易触发接口限流,实际使用建议调小
limit参数做分页加载 types字段返回值为数组结构,每个元素包含类型名称、对应详情地址,单属性宝可梦数组长度为1,双属性宝可梦数组长度为2
内容的提问来源于stack exchange,提问作者Alejandro Arias Aguilar
相关产品推荐
相关产品推荐

