我想同时从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)
});
}
答案 0 :(得分: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 :(得分:0)
您可以使用Promise.all,它将在所有诺言都兑现时解决,或者在任何诺言失败时拒绝。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
答案 2 :(得分:0)
您绝对可以调用两个单独的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)
})