异步 setState 在 componentDidMount 中不起作用,但在其他地方起作用:React Native

Asyncronous setState not working in componentDidMount, but working elsewhere: React Native

我的计划是从 header 中带有授权令牌的 http 请求中获取一个字符串数组,然后使用该数组来决定要呈现的内容(多个组件意味着用户是管理员,因此他将被发送到 listView e.t.c)

我如何存储授权令牌:(react-native-router-flux 用于导航)

    AsyncStorage.setItem('access_token',token).then((value)=> { Actions.pageTwo()}).done() 
//navigates to second page

第二页有

var HotelAdminService = require('./services.js');
....
constructor(props) {
  super(props);
  this.state={
   keyLoaded:false,
  };
  this.tester= HotelAdminService.tester.bind(this); 
}

componentDidMount() {
  HotelAdminService.tester.bind(this);
 }

render() {
    console.log(this.state);
    if (!(this.state.keyLoaded) ) {
      return this.renderLoadingView();
    }
    return (
      <View style={styles.viewContainer} >
        <SearchBar onChangeText={(e) => this.clickMovie(e)}>  </SearchBar>
        <ListView dataSource={this.state.dataSource} renderRow=    {this.renderMovie} style={styles.listView}/>
      </View>
   );
 }

services.js:

exports.tester=function(){
let REQUEST_URL= config.baseUrl + 'api/HotelAdmin/GetKey';


 AsyncStorage.getItem('access_token').then((value) => {

fetch(REQUEST_URL, {
method: 'GET',
headers: {
  'Authorization': 'Bearer ' + value,
 }
 }).then((response) => {return response.json()}  ).then((responseData) => {

 this.setState(
   {key: responseData,
    keyLoaded: true,
    dataSource: this.state.dataSource.cloneWithRows(responseData),
  });
  }).done();



});



}

现在我知道这个方法是有效的,因为它完成了我想要它做的事情,但是 只有当我从第二页单击按钮调用它时 。然而,我想要做的是让 HotelAdmin.tester 在开始时工作,这样当我得到 data.As 时它可以导致 re-render 你可以看到我的渲染方法提供了一个加载屏幕,直到keyLoaded 变为真。也许一种替代方法是 return 字符串而不是更改状态的测试方法,但是我无法从嵌套的 promise 调用中 return 字符串数组。

在当前情况下,代码停留在加载屏幕中,因为 HotelSystemAdmin.tester 不会 运行 并更改状态

您只是将函数绑定到 componentDidMount 中的上下文。您需要调用它:

HotelAdminService.tester.bind(this)();