Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 根据第一个API响应为每个数组元素发出API请求_Reactjs_Api_Async Await_Axios_Fetch - Fatal编程技术网

Reactjs 根据第一个API响应为每个数组元素发出API请求

Reactjs 根据第一个API响应为每个数组元素发出API请求,reactjs,api,async-await,axios,fetch,Reactjs,Api,Async Await,Axios,Fetch,我目前正在学习如何在React JS with hooks中使用async/await。我正在尝试对https://restcountries.eu/。firs电话需要获得所选国家边界的信息。输出为[“CAN”,“MEX”]。然而,我需要得到这些边界的全名。这就是我想打第二个电话的原因。因为我有一个包含两项的数组,所以我需要为它们中的每一项进行一个新的API调用。我已经被这件事困扰了一段时间了。考虑到第一次调用中有一个数组,进行第二次调用的正确方法是什么 import React, { useE

我目前正在学习如何在React JS with hooks中使用async/await。我正在尝试对
https://restcountries.eu/
。firs电话需要获得所选国家边界的信息。输出为[“CAN”,“MEX”]。然而,我需要得到这些边界的全名。这就是我想打第二个电话的原因。因为我有一个包含两项的数组,所以我需要为它们中的每一项进行一个新的API调用。我已经被这件事困扰了一段时间了。考虑到第一次调用中有一个数组,进行第二次调用的正确方法是什么

import React, { useEffect, useState } from "react";
import axios from "axios";

const App = () => {
    const [countryDetails, setCountryDetails] = useState({});
    const [borderNames, setBorderNames] = useState([]);

   //FIRST API CALL
    useEffect(() => {
        const fetchData = async () => {
            try {
                const response = await axios(
                    `https://restcountries.eu/rest/v2/name/usa?fullText=true`
                );
                setCountryDetails(response.data[0]);
            } catch (err) {
                console.log(err);
            }
        };
        fetchData();
    }, []);


    //SECONS API CALL - doens't work
    useEffect(() => {
        let borderName = [];
        countryDetails.borders.forEach(async border => {
            try {
                const response = await axios(
                    `https://restcountries.eu/rest/v2/alpha?codes=${border}`
                );
                borderName.push(response.data[0].name);
            } catch (err) {
                console.log(err);
            }
        });
     setBorderNames(borderName);
    }, [countryDetails]);

    console.log(countryDetails.borders); //Output: ["CAN", "MEX"]
    console.log(borderNames); //Output needs to be: ["Canada", "Mexico"]
 
    return (
        <div>
            <h2>App</h2>
        </div>
    );
};

export default App;
import React,{useffect,useState}来自“React”;
从“axios”导入axios;
常量应用=()=>{
const[countryDetails,setCountryDetails]=useState({});
const[borderNames,setboordernames]=useState([]);
//第一个API调用
useffect(()=>{
const fetchData=async()=>{
试一试{
常数响应=等待axios(
`https://restcountries.eu/rest/v2/name/usa?fullText=true`
);
setCountryDetails(response.data[0]);
}捕捉(错误){
控制台日志(err);
}
};
fetchData();
}, []);
//SECONS API调用-不起作用
useffect(()=>{
设borderName=[];
countryDetails.borders.forEach(异步边框=>{
试一试{
常数响应=等待axios(
`https://restcountries.eu/rest/v2/alpha?codes=${border}`
);
borderName.push(response.data[0].name);
}捕捉(错误){
控制台日志(err);
}
});
订单名称(borderName);
},[countryDetails]);
console.log(countryDetails.borders);//输出:[“CAN”,“MEX”]
console.log(borderNames);//输出需要:[“加拿大”、“墨西哥”]
返回(
应用程序
);
};
导出默认应用程序;

您的第二次提取是异步的,因此,因为您不等待它,
useffect
在响应到达之前将
borderNames
设置为空数组(初始值)

除了等待响应之外,您还可以在
try
块中进行此更改:

const response = await axios(
   `https://restcountries.eu/rest/v2/alpha?codes=${border}`);

setBorderNames(prevState => prevState.push(response.data[0].name));

您的结构存在一些小问题,请查看此示例,您将发现:

const-App=()=>{
const[countryDetails,setCountryDetails]=React.useState({});
const[borderNames,setboordernames]=React.useState([]);
React.useffect(()=>{
取回(`https://restcountries.eu/rest/v2/name/usa?fullText=true`)
.然后((res)=>res.json())
.然后((数据)=>setCountryDetails(数据[0]))
.catch((err)=>console.log(err));
}, []);
React.useffect(()=>{
设borderName=[];
if(countryDetails.borders){
countryDetails.borders.forEach((border)=>
取回(`https://restcountries.eu/rest/v2/alpha?codes=${border}`)
.然后((res)=>res.json())
。然后((数据)=>{
borderName.push(数据[0].name);
if(borderName.length==countryDetails.borders.length)
订单名称(borderName);
})
.catch((err)=>console.log(err))
);
}
},[countryDetails]);
返回(
{JSON.stringify(countryDetails.borders)}

{JSON.stringify(borderNames)}

); } render(,document.getElementById(“react”)
一个简单的方法是:

useffect(()=>{
const exec=async()=>{
const borderNames=wait Promise.all(countryDetails.borders.map)(border=>{
返回axios.get(`https://restcountries.eu/rest/v2/alpha?codes=${border}`
}))
setBorderNames(borderNames.map({data})=>data[0].name));
};
exec();
},[countryDetails]);

由于您正在等待第一个响应,因此只需使用相同的技术发送下一个响应,但要基于您刚从第一次呼叫中收到的数据