如何使用 Axios 通过 React 发出循环请求?

Posted

技术标签:

【中文标题】如何使用 Axios 通过 React 发出循环请求?【英文标题】:How to make a loop request with React using Axios? 【发布时间】:2019-10-26 07:14:29 【问题描述】:

如何循环 Axios 请求以填充对象数组?

我正在尝试创建一个使用名为 swapi 的星球大战 API 的 Web 界面。可以通过这个链接访问:https://swapi.co/

我可以搜索人物、星际飞船、行星、物种和电影。因此,例如,如果我想搜索 Luke Skywalker,我添加 /api/people/1/ 就像 https://swapi.co/api/people/1/ 一样。

到目前为止一切顺利。

现在,如果我想要每个星球大战角色,我只需删除数字 1,网址将是 https://swapi.co/api/people/,我想我将拥有 87 个字符中的前十个字符。

但我不想要 10 个。我想要所有这些……这使我需要执行多个请求来获取所有字符数据。问题是,如果我使用循环来发出请求,比方说 while 循环,它会在第一个请求将数据带到我的代码进行处理之前完成所有搜索。

我正在通过 Redux 使用全局状态,我正在通过 componentDidMount() 调用 Redux Thunk。它工作正常,实际上,前十个字符数据被检索,它们填充了我在 React 中的渲染方法。但是,我怎样才能发出多个请求而不会在这些请求之前结束循环呢?

【问题讨论】:

您可能想为此搜索“javascript 中的同步与异步”。关于这个主题有很多精彩的文章。 您要查找的术语是“分页” 【参考方案1】:

如果我使用 async / await 解决了您的问题,这就是我的解决方案:

getCharacter = async i => 
  let  characters  = this.state;
  let res = await axios.get(`https://swapi.co/api/people/$i/`);
  characters.push(res);
  this.setState( characters );
  return res;
;

componentDidMount() 
  // ids = [1, 2, 3, ..., 10]
  let ids = Array.from(length: 10, (v, k) => k+1)
  Promise.all(ids.map(id => this.getCharacter(id)))

下面是代码沙盒中的完整代码: https://codesandbox.io/embed/axios-react-ojpew?fontsize=14

【讨论】:

你好 Vahid Al,我打开了代码框链接,结果是 10 个名字。是否可以加载所有 87 个字符?经过我所有的尝试,我仍然只得到了 10 个名字。 当然,只需将 ids 长度从 10 更改为 87。我也更改了代码框。 让 ids = Array.from(length: 87, (v, k) => k+1) 抱歉,我没有意识到我可以更改长度。这就是解决方案。到目前为止,我还不知道 async / await 。非常感谢。 不客气,也许你想看看这个:javascript.info/async-await

以上是关于如何使用 Axios 通过 React 发出循环请求?的主要内容,如果未能解决你的问题,请参考以下文章

React - Axios 调用发出过多请求

REACT 如何使用 Redux 和 Axios(使用 promise 中间件)发出 AJAX 请求?

如何在 React 应用程序中使用 JEST 测试向 api 发出 axios 请求的异步函数

如何从服务器端 express/mongo/mongoose 中的 URL,客户端的 axios/react/redux 中获取参数 ID

无法使用来自 react/axios 的 JSON 发出 POST 请求以恢复服务器

如何在客户端处理 CORS 错误(React-Redux-Axios)