React Native获取异步存储返回Unhandled Promise

时间:2016-08-21 10:56:48

标签: javascript reactjs react-native

现在我想在用户登录成功后保存用户令牌。

这是我的代码:

 da.Fill(ds, "tbl_studentData");

我已确保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.js上:

tweets

我只是简单 constructor(props){ super(props); this.state({token : ''}); } componentWillMount() { AsyncStorage.getItem('token', (err, value) => { console.log(value); }) } 来查看令牌是否已保存。 但每次登录都会完成(显示成功日志)。输入我的推文时我总是遇到这个错误:

error

任何解决方案?

感谢。

1 个答案:

答案 0 :(得分:1)

最有可能发生的是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,那么这是一个axios错误,否则会出现另一个错误:

.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 : ''};