React - 获取多个api

问题描述 投票:1回答:3

我想从2个不同的URL同时向多个api发出get请求,然后我想用新属性“img”更新状态中的数组“items”,而不是覆盖它。我想在第一个请求中保留和属性。这是我的尝试。

   componentDidMount(){

      let url = ``;
      let url2 = ``

        fetch(url,{
          method: 'GET'
        })
        .then((response)=> response.json())
        .then((responseJson) => {
          const newItems = responseJson.items.map(i => {
            return{
              itemId: i.itemId,
              name: i.name,
            };
          })
          const newState = Object.assign({}, this.state, {
            items: newItems
          });

          console.log(newState);
          this.setState(newState);
        })
        .catch((error) => {
          console.log(error)
        });
        fetch(url2,{
          method: 'GET'
        })
        .then((response)=> response.json())
        .then((responseJson) => {
          const newImg = responseJson.item.map( data=> {
            return{
              img: data.picture.url
            };
          })
          const newState = Object.assign({}, this.state, {
            items: newImg
          });

          console.log(newState);
          this.setState(newState);
        })
        .catch((error) => {
          console.log(error)
        });
    }
reactjs rest api get fetch-api
3个回答
1
投票

使用Promise.all():

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, "foo");
}); 

Promise.all([p1, p2, p3]).then(values => { 
  console.log(values); // [3, 1337, "foo"] 
});

参考:https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Promise/all


1
投票

你绝对可以调用两个单独的API。您遇到的问题是最后返回的API调用将覆盖从第一个API调用中保存的数据。这是修复此问题的代码。

componentDidMount(){

  let api1 = `https://myapiexample1.com`;
  let api2 = `https://myapiexample2.com`;

  let promise1 = fetch(api1)
  .then(response => response.json())
  .then(json => json.items.map(item => {
    return {
      itemId: item.itemId
      name: item.name
    }
  }))

  let promise2 = fetch(api2)
  .then(response => response.json())
  .then(json => json.items.map(item => {
    return {
      img: item.img
    }
  }))

  Promise.all([promise1, promise2])
  .then(results => results[0].concat(results[1]))
  .then(items => this.setState({itmes}))
}

另一种方法不是很干净,但与您目前正在做的类似,是确保在向州添加新项目时包含旧状态:

this.setState({
  items: newItems.concat(this.state.items)
})

0
投票

您可以使用Promise.all,它将在所有承诺正常时解决,或者如果失败则拒绝。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

© www.soinside.com 2019 - 2024. All rights reserved.