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
它来查看如果令牌没有被保存。 但每次登录完成(成功登录都会显示)。
任何解决方案:当进入我的微博,我总是得到这个错误?
谢谢。
答
什么是最有可能发生的是,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 : ''};
好吧,这一切都有道理。我尝试删除我的'catch'及其所有正常工作,但是在我修复this.state = {token:''}'后。谢谢! – ssuhat