javascript - 如何将两个获取请求合并到同一个数组中?

标签 javascript reactjs

我试图在一次调用中合并两个获取请求,这样我就可以获取同一个数组中的所有数据。

我已经尝试过 Promise.all 方法,但我不知道它是否是正确的方法。

getWeather = async (e) => {
e.preventDefault();
const city = e.target.elements.city.value;
//const api_call = await
const promises = await Promise.all([
   fetch(`http://api.openweathermap.org/data/2.5/weather?q=${city}&units=metric&APPID=${API_KEY}`),
  fetch(`http://api.openweathermap.org/data/2.5/forecast?q=${city}&units=metric&APPID=${API_KEY}`)
])

const data = promises.then((results) =>
Promise.all(results.map(r => r.text())))
.then(console.log)

代码确实有效,我正在取回数据,但我无法理解 json 响应。

  (2) ["{"coord":{"lon":-5.93,"lat":54.6},"weather":[{"id"…7086601},"id":2655984,"name":"Belfast","cod":200}", "{"cod":"200","message":0.0077,"cnt":40,"list":[{"d…on":-5.9301},"country":"GB","population":274770}}"]

我应该如何设置状态? 我的状态是这样设置的,只有一个调用。

  if (city) {
  this.setState({
    temperature: data[0].main.temp,
    city: data[0].name,

有更好的方法吗?

最佳答案

我会:

  getWeather = async (e) => {
   e.preventDefault();

   const fetchText = url => fetch(url).then(r => r.json()); // 1

   const /*2*/[weather, forecast] = /*3*/ await Promise.all([
     fetchText(`.../weather`),
     fetchText(`.../forecast`)
   ]);

   this.setState({ temperature: weather.temp, /*...*/ });
 }

1:通过使用小助手,您不必调用 Promise.all 两次。这两个请求是并行完成的(你应该使用 .json() 因为你想将它解析为 JSON)。

2:通过数组解构可以轻松取回promises结果。

3:通过 awaiting,您可以从 async 函数中获得实际好处:您不需要嵌套的 .then

关于javascript - 如何将两个获取请求合并到同一个数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55991302/

相关文章:

javascript - 对 JavaScript 文件的更改未在 Chrome 上显示

javascript - Bing 获取光标位置

javascript - For循环不适用于js map 功能

javascript - React/Flux 实现技术不清楚父组件何时需要在子组件上拉字符串

javascript - ReactJs setState 回调不工作

css - popover 显示在左上角,因为 div 的宽度非常小,比如 < 2.5 px

javascript - 从输入类型文本获取值

javascript - 单击时通过 $scope 删除元素

reactjs - 在 React 中重定向到另一个路由时如何传递状态/属性?

javascript - Redux 路由器 - "Dispatch is not defined"