我有很多彼此独立的api,因此在呈现前需要存储在React状态。我在fetch
中有componentDidMount
个电话,但是我不确定什么是最好的方法。
我是不是该...
1.具有嵌套的提取调用
示例:
componentDidMount() {
fetch('url')
.then((res) => res.json())
.then((data) => {
// call another fetch in here
})
}
或 2.有单独的提取调用
示例:
componentDidMount() {
fetch('url')
.then((res) => res.json())
.then((data) => {
// set state in here
})
// call another fetch for the other url endpoint
fetch('url2')
.then((res) => res.json())
.then((data) => {
// set state in here
})
}
我不确定一种方法是否比另一种方法更好,但是我很想知道你们的想法以及某些利弊。
更新:我现在正在使用Promise.all(),但是我得到的是Promise返回而不是实际值。这是我的代码:
Promise.all([
fetch(`/api/url1`),
fetch(`/api/url2`),
])
.then(([res1, res2]) => (
{
res1: res1.json(),
res2: res2.json(),
}))
.then(({res1, res2}) => {
this.setState({
state1: res1,
state2: res2,
});
})
.catch((error) => {
console.log(error);
});
当我在控制台上检查状态值时,会得到以下信息:
Promise
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Array(6530)
我可能会想念什么/做错什么了吗?
谢谢!
答案 0 :(得分:2)
只要fetch
返回Promise
,您就可以使用Promise.all
函数来并行执行两个提取:
componentDidMount() {
Promise.all([fetch('url'), fetch('url2')])
.then(([res1, res2]) => {
return Promise.all([res1.json(), res2.json()])
})
.then(([res1, res2]) => {
// set state in here
});
}
答案 1 :(得分:2)
如@CertainPerformance所述,您应该使用Promise.all
方法。
Promise.all([
fetch("url1"),
fetch("url2"),
fetch("url3"),
]).then(([res1, res2, res3]) => {
this.setState({status: "fetched"})
})
const url = "https://asdqwe.free.beeceptor.com/my/api/path";
const promises = Promise.all([
fetch(url),
fetch(url),
fetch(url),
]);
promises
.then((results) =>
Promise.all(results.map(r => r.text()))
)
.then(console.log)