React Native获取异步存储返回未处理的承诺

问题描述:

现在我想在用户登录成功后保存用户令牌。React Native获取异步存储返回未处理的承诺

这里是我的代码:

onPress(){ 
    return axios.post('https://api.example.net/v1/user/auth/login', { 
    email: this.state.email, 
    password: this.state.password, 
    }, { 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json', 
    }, 
    }).then((response) => { 
    AsyncStorage.setItem('token', response.data.login._cxz,() => { 
     console.log('success'); 
    }); 
    this.props.navigator.immediatelyResetRouteStack([{name: 'tweets'}]); 
    }) 
    .catch((error) => { 
     this.setState({errorMessage: error.response.data.message}); 
    }); 
} 

我已经确保response.data.login._cxz有一个值。 直到这里工作。登录将把我重定向到tweets路线。

在我tweets.js:

constructor(props){ 
    super(props); 
    this.state({token : ''}); 
    } 
    componentWillMount() { 
    AsyncStorage.getItem('token', (err, value) => { 

     console.log(value); 
    }) 
    } 

我只是简单的console.log它来查看如果令牌没有被保存。 但每次登录完成(成功登录都会显示)。

error

任何解决方案:当进入我的微博,我总是得到这个错误?

谢谢。

什么是最有可能发生的是,then回调在navigator.immediatelyResetRouteStack抛出一个错误:

.then((response) => { 
    AsyncStorage.setItem('token', response.data.login._cxz,() => { 
    console.log('success'); 
    }); 
    this.props.navigator.immediatelyResetRouteStack([{name: 'tweets'}]); 
}) 
.catch((error) => { 
    this.setState({errorMessage: error.response.data.message}); 
}); 

那么错误是夹在catch块,但由于误差是正常的JavaScript Error而不是axios错误,它没有response属性,因此试图访问error.response.data会导致未定义的错误。

最简单的方法来检测错误的类型是鸭式吧:如果错误有response,那么它是一个爱可信错误,否则另一个错误:

.catch((error) => { 
    if (error.response && error.response.data) { 
    this.setState({errorMessage: error.response.data.message}); 
    } else { 
    this.setState({errorMessage: error.message}); 
    } 
}); 

造成immediatelyResetRouteStack的错误是可能来自在同一个调用堆栈上同步执行的React渲染过程。一旦你修复损坏.catch你会看到错误消息是什么,但一个很好的猜测为您有限的代码样本中的罪魁祸首是:

this.state({token : ''}); 

这应该是一个属性赋值,而不是一个方法调用:

this.state = {token : ''}; 
+0

好吧,这一切都有道理。我尝试删除我的'catch'及其所有正常工作,但是在我修复this.state = {token:''}'后。谢谢! – ssuhat