在componentDidMount中从一个axios到另一个axios获取数据

时间:2019-05-07 19:03:31

标签: javascript reactjs axios

在componentDidMount中,我试图从/api/topics/${params.TopicId路由中获取名为topic的数据,然后从响应中获取数据,我只想将topic.user_id发送到另一条路由,并将整个用户作为响应。但这是行不通的,因为他们正在同时发送请求,因此topic.user_id的状态为空。是我可以做出回应并将其提供给另一个请求的方式吗?我正在componentDidMount中完成此操作,因此将在渲染组件之前完成。

componentDidMount() {
    const {
      match: { params }
    } = this.props;

    axios
      .get(`/api/topics/${params.TopicId}`)
      .then(response => {
        this.setState({ topic: response.data });
      })
      .catch(function(error) {
        console.log(error);
      });

    axios
      .get(`/api/users/${this.state.topic.user_id}`)
      .then(response => {
        this.setState({ user: response.data });
      })
      .catch(function(error) {
        console.log(error);
      });
  }

3 个答案:

答案 0 :(得分:4)

componentDidMount() {
  const {
    match: { params }
  } = this.props;

  fetch(`/api/topics/${params.TopicId}`,(response)=>{
    this.setState({ topic: response.data } , 
      {
        fetch(`/api/users/${this.state.topic.user_id}` ,(response)=>{
          this.setState({ user: response.data });
        } )
      });

}

const fetch = (uri,callBack) =>{
  axios
  .get(uri)
  .then(response => {
    callBack(response)
  })
  .catch(function(error) {
    console.log(error);
  });
}

最好使用设置状态回调参数

setState(updater[, callback])

https://reactjs.org/docs/react-component.html#setstate

因为您需要在下一次提取之前更新状态

答案 1 :(得分:2)

您可以像这样将Promises链接在一起:

componentDidMount() {
  const {
    match: { params }
  } = this.props;

  axios
    .get(`/api/topics/${params.TopicId}`)
    .then(response => {
      this.setState({ topic: response.data });
      return axios.get(`/api/users/${response.data.user_id}`);
    })
    .then(response => {
      this.setState({ user: response.data });
    })
    .catch(function(error) {
      console.log(error);
    });
}

答案 2 :(得分:0)

您可以使用回调。

const func = (id, cb) => axios
  .get(`/api/topics/${id}`)
  .then(response => {
    this.setState({ topic: response.data });
    cb(response.data.user_id);
  })
  .catch(function(error) {
    console.log(error);
  });

这样,您可以致电...

func(params.TopicId, user_id => axios
  .get(`/api/users/${user_id}`)
  .then(response => {
    this.setState({ user: response.data });
  })
  .catch(function(error) {
    console.log(error);
  })
)