英文:
async fetch pushing data twice into array
问题
以下是你要的翻译部分:
我正在尝试使用fetch和异步箭头函数进行Rick & Morty API调用,但我发现该函数将接收到的元素推送两次到我的数组中。
我已经尝试过使用和不使用useEffect(我正在使用React与TypeScript),但没有结果,我不明白为什么该函数被调用两次。
有人可以解释为什么会发生这种情况吗?
期望输出:包含2个对象的数组(ID为1和2的行星)
实际输出:包含4个对象的数组(ID为1的行星出现两次,ID为2的行星也出现两次)
如果有人可以帮助我理解为什么会发生这种情况以及如何修复它,我将非常感激。
请注意,我已经将HTML和代码部分排除在外,只翻译了你提供的问题和期望输出。
英文:
I'm trying to make a Rick & Morty API call with fetch and an async arrow function, but I found that the function is pushing the elements received twice into my array.
I already tried to make the call with and without useEffect (I'm using React with TypeScript) but I got no results and I don't understand why the function is being called twice.
Anyone available to explain to me why this is happening?
data.ts:
import { PlanetInterface, ResidentsInterface } from "./data-interfaces";
export const planetsList: PlanetInterface[] = [];
export const residentsList: ResidentsInterface[] = [];
export const getPlanetById = async (planets: number[]) => {
for (let planet of planets) {
const response = await fetch(
`https://rickandmortyapi.com/api/location/${planet}`
);
const planetData: PlanetInterface = await response.json();
planetsList.push(planetData);
}
console.log(planetsList);
};
// export const getResidentsByPlanet = async (residents: string[]) => {
// for (let resident of residents) {
// const response = await fetch(resident);
// const residentData = await response.json();
// residentsList.push(residentData);
// }
// console.log(residentsList);
// };
app.tsx:
import { useEffect } from "react";
import { getPlanetById } from "./api/data";
import "./App.css";
function App() {
useEffect(() => {
getPlanetById([1, 2]);
}, []);
// getPlanetById([1, 2]);
return <main className="container"></main>;
}
export default App;
Expected output: Array of 2 objects (planets with ID 1 and 2)
Received output: Array of 4 objects (planet with ID 1 twice and planet with ID 2 also twice)
If anyone can help me understand why this is happening and how I can fix it, I would be very grateful.
答案1
得分: 0
I guess you are using <React.StrictMode />
If you remove that, the function is called once as you expect.
Here is the document about strict mode
https://en.reactjs.org/docs/strict-mode.html
英文:
I guess you are using <React.StrictMode />
If you remove that, the function is called once as you expect.
Here is the document about strict mode
https://en.reactjs.org/docs/strict-mode.html
答案2
得分: 0
getPlanetById
的设计可能不适合React,因为调用它会产生副作用,而且没有清理的方法,你应该将它包装成一个钩子(hook)或手动清理,这里是一个示例:
useEffect(() => {
getPlanetById([1, 2]);
return () => { planetsList.length = 0 }
}, []);
英文:
The design of that getPlanetById
might be not suit for React since the call of it create a side effect and there is no way to clean it up, you should wrap it into a hook or do a manually clean up, here is an example:
useEffect(() => {
getPlanetById([1, 2]);
return () => { planetsList.length = 0 }
}, []);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论