javascript - React - 从 API 返回数据
问题描述
我知道有类似的问题,但我找不到答案。
首先,请告诉我我是否做错了什么
我需要使用来自 API 调用的数据填充我的状态。这在上面的代码中运行良好:
export const GetPlanets = async () => {
const planets = await axios.get(`${BASE_URL}`).catch((e) => {
console.error(e);
})
return planets.data.results
}
但是后来我需要从一个 json 响应文件中对多个链接进行第二次调用,并且我设法使其工作(虽然不知道这是否是正确的方法)
const GetPlanets = async () => {
let planetas = {}
await axios.get(`${PLANETS_URL}`)
.then((p) => {
planetas = p.data.results
return axios.get(`${FILMS_URL}`)
}).then((f) => {
planetas.films.forEach((v, i) => {
planetas[i].film = f
})
})
})
.catch((e) => {
console.error(e);
})
return planetas
}
这是我的组件文件,我尝试在其中获取对象,就像我之前做的那样
useEffect(() => {
const fetchPlanetas = async () => { // ME TRYING...
const planetas = await GetPlanets()
setPlanetas(planetas)
setToShow(planetas[0])
};
fetchPlanetas()
}, [])
但我得到的只是未定义
解决方案
你得到一个数组,undefined
因为.map()
需要一个返回值。在您的两个.map()
回调中,您都没有返回任何内容。
const results = [1, 2, 3, 4]
const results2 = results.map(elem => {
elem = elem + 1
})
console.log(results2)
但是,即使您确实在.map()
回调中返回了某些内容,GetFilms(f)
也是异步的,因此您不会GetFilms()
像预期的那样得到映射到数组中的结果。
你有几个选择:
如果您有权访问 API,请在您提出第一个请求时将影片数据与其余数据一起发送。
使用
async/await
和Promise.all()
获得响应。
推荐阅读
- c# - 如何测试 3D 数组的一行中的任何元素(C#)
- rust - 如何在 Rust 中使用 Windows IOCP 实现异步函数?
- reactjs - Apollo useQuery:API 运行良好,但数据未定义
- java - 在 Github.com 上阅读代码时如何导航到另一个方法或类
- java - 尝试使用 java/javafx 在 intellij 上启动并运行 maven
- c++ - 如何构造一个可以使用指针成员对指针数组进行排序的函数
- javascript - 我可以把等号去掉吗?
- javascript - 为什么在这个 vega-lite 图中编码是这样拆分的?
- if-statement - if-else-if 梯形图分支的通用代码
- html - 在heroku中刷新页面时无法获取/登录?