2017-03-01 57 views
0

我试图在'superagent'的请求中更改我的状态,但console.log的结果是未定义的。大家可以帮我吗?在Superagent请求上更改状态

componentDidMount(){ 

    var self = this; 

    Request.get('https://api.navitia.io/v1/coverage/fr-idf/stop_areas/stop_area%3AOIF%3ASA%3A59491/departures?') 
     .auth('******') 
     .end(function(err, res){ 
      if(err){ 
       return err; 
      } 
      let departures = res.body.departures; 
      self.setState({body: departures}); 
     }); 
    console.log(this.state.departures); 
} 

回答

0

setStateusually asynchronous,虽然它可以在某些情况下,是同步的(如名为react上下文之外 - 例如,如果传递的setState到非反应DOM节点/功能)。在这种情况下,它被异步设置,并与其他状态更新进行批处理,这些更新可能会在相同的刻度/帧中进行。例如,如果您在componentWillUpdatecomponentDidUpdate(但仅在下一个勾号)中记录this.state.departures,则会在那里看到您的价值。即使您将控制台语句放入setTimeout(console.log(...), 100),您也可能无法获得undefined

或者,如果您需要根据该值采取行动并且无法或不想使用生命周期方法,则可以使用回调调用setState,如下所示:setState((state) => return mutatedState)。您将永远不会在回调中收到陈旧状态,例如按顺序呼叫setState将始终按预期行事。

0

两件事情:

  1. 您没有设置depatures状态,但body状态。
  2. setState可以是异步的,所以最好把它的回调放入日志中。

试试这个:

componentDidMount() { 
    const self = this; 

    Request.get('https://api.navitia.io/v1/coverage/fr-idf/stop_areas/stop_area%3AOIF%3ASA%3A59491/departures?') 
    .auth('******') 
    .end(function(err, res){ 
     if(err) return err; 
     let departures = res.body.departures; 
     self.setState({ departures }); 
    },() => console.log(this.state.departures)); 
}