componentDidMount多次读取调用最佳做法?

时间:2018-10-18 21:32:05

标签: javascript reactjs api fetch

我有很多彼此独立的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)

我可能会想念什么/做错什么了吗?

谢谢!

2 个答案:

答案 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)