【发布时间】:2021-02-27 05:38:19
【问题描述】:
我对此很菜鸟,所以我想做的是获取 pokeapi.co (pokemon api) 的数据,所以我得到一个包含对象的数组,每个对象都有一个 url,这个 url 你可以获取它并获取有关当前口袋妖怪的所有信息...它工作正常,直到我尝试将数组与内部的所有对象映射并显示以下错误...(我尝试使用 async/await 但不知道如何使用它...帮助!)
import Card from "./card"
import React,{useState,useEffect} from "react"
function App() {
const [pokemon,setPokemon]=useState()
const[loading,setLoading]=useState(true)
useEffect(
async ()=>{
return await fetch("https://pokeapi.co/api/v2/ability/?limit=20&offset=20")
.then(res=> res.json())
.then( async data=>{return await data.results.map(async element=>{return await fetch(element.url).then(res=>res.json()).then(data=>{return setPokemon(prevState=>{return [...prevState,{data}]})})})})}
,[])
return (
<div className="App">
<header id="header" className="py-10 w-full bg-yellow-500">
<h1 className="text-4xl text-center font-bold text-red-700">Pokedex.</h1>
</header>
{loading && <div class="rounded-t-lg overflow-hidden border-t border-l border-r text-center p-4 py-12">
<span class="inline-flex rounded-md shadow-sm">
<button type="button" class="inline-flex items-center px-4 py-2 border border-transparent text-base leading-6 font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-500 focus:outline-none focus:border-indigo-700 focus:shadow-outline-indigo active:bg-indigo-700 transition ease-in-out duration-150 cursor-not-allowed" disabled="">
<svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>
Processing
</button>
</span>
</div>}
<div className="grid grid-cols-4 gap-4 my-10 px-10">
{pokemon? pokemon.results.map((element,index)=>{return <Card key={index} name={ element.name.toUpperCase()} />}):null}
</div>
<footer className="text-center text-gray-500 font-bold">2020</footer>
</div>
);
}
export default App;
当我拿到这个(https://pokeapi.co/api/v2/ability/?limit=20&offset=20) 我得到这个 所以我尝试获取对象内的每个 url 以获取有关当前 pokemon 的所有信息,所以响应是这样的 我想要做的是将这些数据保存在状态中以便以后呈现它
我迷失在使用 async/await...
【问题讨论】:
-
混合
await和.then()回调只会导致代码混乱。坚持一个约定 -
看起来错误是说您的
pokemon状态值不可迭代,因此无法传播。请更新您的问题以包含Minimal, Complete, and Reproducible 组件代码示例。我同意@Phil,async/await 看起来完全是多余的,因为效果 never 处理等待的返回值。 -
await data.results.map没有意义,因为data.results.map返回的是一个数组,而不是一个 Promise -
also ...
[...prevState, { data }]意味着每次迭代都会覆盖相同的data:属性 - 所以,你最终会得到一个
标签: javascript reactjs fetch-api