React.js 获取 API 的多个端点

React.js fetch multiple endpoints of API

我正在做一个 React.js 项目。我正在尝试从具有多个端点的 API 中提取数据。我在创建一个函数时遇到了问题,该函数可以一次提取所有数据,而不必单独执行每个端点。 console.log 给出一个空数组,没有显示任何内容。道具 'films' 是来自 parent 的数据并且工作正常。它也来自同一 API 的另一个点。这是代码:

import { useEffect, useState } from "react";

import styles from './MovieDetail.module.css';

const MovieDetail = ({films}) => {
    const [results, setResults] = useState([]);

    const fetchApis = async () => {
        const peopleApiCall = await fetch('https://www.swapi.tech/api/people/');
        const planetsApiCall = await fetch('https://www.swapi.tech/api/planets/');
        const starshipsApiCall = await fetch('https://www.swapi.tech/api/starships/');
        const vehicleApiCall = await fetch('https://www.swapi.tech/api/vehicles/');
        const speciesApiCall = await fetch('https://www.swapi.tech/api/species/');
        const json = await [peopleApiCall, planetsApiCall, starshipsApiCall, vehicleApiCall, speciesApiCall].json();
        setResults(json.results)        
    }

    useEffect(() => {
            fetchApis();
    }, [])

    console.log('results of fetchApis', results)

    return (
        <div className={styles.card}>
            <div className={styles.container}>
                <h1>{films.properties.title}</h1>
                <h2>{results.people.name}</h2>
                <p>{results.planets.name}</p>
            </div>            
        </div>
    );
}
 
export default MovieDetail;

更新

我刚刚将 Phil 的 post 添加到代码中并上传到 codesanbox

您想从每个请求中获取并检索 JSON 流。

像这样

const urls = {
  people: "https://www.swapi.tech/api/people/",
  planets: "https://www.swapi.tech/api/planets/",
  starships: "https://www.swapi.tech/api/starships/",
  vehicles: "https://www.swapi.tech/api/vehicles/",
  species: "https://www.swapi.tech/api/species/"
}

// ...

const [results, setResults] = useState({});

const fetchApis = async () => {
  try {
    const responses = await Promise.all(Object.entries(urls).map(async ([ key, url ]) => {
      const res = await fetch(url)
      return [ key, (await res.json()).results ]
    }))

     return Object.fromEntries(responses)
  } catch (err) {
    console.error(err)
  }
}

useEffect(() => {
  fetchApis().then(setResults)
}, [])

每个 URL 将解析为一个数组,例如...

[ "people", [{ uid: ... }] ]

一旦所有这些都解决了,它们将成为一个对象(通过Object.fromEntries()),如

{
  people: [{uid: ... }],
  planets: [ ... ],
  // ...
}

请注意,每个 属性 都是一个数组,因此您需要

<h2>{results.people[0].name}</h2>

或循环。