React useEffect和Axios:在Axios异步中进行链接的API调用

时间:2020-05-20 01:39:11

标签: reactjs asynchronous promise axios use-effect

我正在对一个API进行多个API调用。在接下来的两个通话中,我需要使用第一个通话中的数据。我正在从NHL API中提取数据,以检索每个会议中的第一名。

我已经做到了:

useEffect(() => {
    axios.get(`https://statsapi.web.nhl.com/api/v1/standings/byConference`)
      .then(res => {
        // 0th element is Eastern Conference leader, 1th is Western Conference Leader
        let teamEndpoint = [Object.values(res.data.records).map((x) => x.teamRecords[0].team.link)];

        // Eastern Conference team API endpoint
        let eastern = teamEndpoint[0];

        // Western Conference team API endpoint
        let western = teamEndpoint[1];

        // Get Eastern Conference Leader team's name
        axios.get(`https://statsapi.web.nhl.com${eastern}/`)
          .then(res => {
            setEasternConferenceLeader(res.data.teams[0].teamName);
          })
          .catch(err => {
            console.log('Error retrieving Eastern Conference Team data : ' + err);
          });
        // Get Eastern Conference Leader team's name
        axios.get(`https://statsapi.web.nhl.com${western}/`)
        .then(res => {
          setWesternConferenceLeader(res.data.teams[0].teamName);
        })
        .catch(err => {
          console.log('Error retrieving Western Conference Team data : ' + err);
        });
      })
  }, []);

第一个调用检索两个端点。一个用于东方会议团队,一个用于西方会议团队。检索了两个端点之后,我想用该数据再进行两次调用。

我这样做的方式有效,但是如果我console.log是数据,则最初是undefined。稍后在程序中,我将使用这些调用的结果来渲染图像,并且出现错误。我的猜测是因为我正在尝试在后续API调用完成之前渲染图像。

如何制作上面的代码asynchronous,所以我没有这个问题?

1 个答案:

答案 0 :(得分:0)

您的问题与axios调用无关,但是在组件初始化时您无法处理空数据。您必须检查是否尚未检索到数据,然后渲染诸如旋转加载之类的内容,直到AJAX调用完成。