反应获取多个获取请求
React fetching multiple get requests
是否有更简单或更有条理的方法来获取多个请求而无需使用 for 循环?我基本上想获取有关所有 Kanto 口袋妖怪(151 个口袋妖怪)的所有信息,然后在获取所有 151 个请求后仅提取口袋妖怪的名称和正面精灵,用新填充的数组更新我的状态。我正在考虑使用 Promise.all 这样做,但我无法跟踪每个口袋妖怪的计数器。
const [pokemondata,setPokemondata] = useState([]);
useEffect(() => {
const pokemon = []
for (let i = 1;i < 152; i++) {
fetch(`https://pokeapi.co/api/v2/pokemon-form/${i}`)
.then((response) => {
return response.json()
})
.then((data) => {
pokemon.push({name: data.name,sprite: data.sprites.front_default})
})
}
setPokemondata(pokemon)
},[])
创建一个承诺数组。我使用了 Array.from()
,但您也可以使用 for 循环并将承诺推送到数组。然后使用Promise.all()
等待所有的promises,准备就绪时设置状态:
const { useState, useEffect } = React;
const Demo = () => {
const [pokemondata, setPokemondata] = useState([]);
useEffect(() => {
Promise.all(Array.from({ length: 3 }, (_, i) => // change number to 151
fetch(`https://pokeapi.co/api/v2/pokemon-form/${i + 1}`)
.then(res => res.json())
.then(({ name, sprites }) => ({
name,
sprite: sprites.front_default
}))
)).then(setPokemondata)
},[])
return <div>{JSON.stringify(pokemondata)}</div>
}
ReactDOM.render(
<Demo />,
root
)
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="root"></div>
是否有更简单或更有条理的方法来获取多个请求而无需使用 for 循环?我基本上想获取有关所有 Kanto 口袋妖怪(151 个口袋妖怪)的所有信息,然后在获取所有 151 个请求后仅提取口袋妖怪的名称和正面精灵,用新填充的数组更新我的状态。我正在考虑使用 Promise.all 这样做,但我无法跟踪每个口袋妖怪的计数器。
const [pokemondata,setPokemondata] = useState([]);
useEffect(() => {
const pokemon = []
for (let i = 1;i < 152; i++) {
fetch(`https://pokeapi.co/api/v2/pokemon-form/${i}`)
.then((response) => {
return response.json()
})
.then((data) => {
pokemon.push({name: data.name,sprite: data.sprites.front_default})
})
}
setPokemondata(pokemon)
},[])
创建一个承诺数组。我使用了 Array.from()
,但您也可以使用 for 循环并将承诺推送到数组。然后使用Promise.all()
等待所有的promises,准备就绪时设置状态:
const { useState, useEffect } = React;
const Demo = () => {
const [pokemondata, setPokemondata] = useState([]);
useEffect(() => {
Promise.all(Array.from({ length: 3 }, (_, i) => // change number to 151
fetch(`https://pokeapi.co/api/v2/pokemon-form/${i + 1}`)
.then(res => res.json())
.then(({ name, sprites }) => ({
name,
sprite: sprites.front_default
}))
)).then(setPokemondata)
},[])
return <div>{JSON.stringify(pokemondata)}</div>
}
ReactDOM.render(
<Demo />,
root
)
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="root"></div>