【问题标题】:React Native - I can't seem to get Axios and AsyncStorage to work together in Android, but the code works on iOS?React Native - 我似乎无法让 Axios 和 AsyncStorage 在 Android 中一起工作,但代码在 iOS 上工作?
【发布时间】:2018-08-09 09:15:20
【问题描述】:

checkState = async() => {

try {
  const value = await AsyncStorage.getItem('access');
  if (value !== null) {
    this.setState({accessToken: value});
  }
}
catch (error) {
  // Error retrieving data
  this.setState({accessToken: ''});
}
var that = this;
if(this.state.accessToken) {
  axios.get(apicallurl, 
  {headers: {
    'Authorization': 'Bearer ' + that.state.accessToken,
     Accept: 'application/json',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  }}) 
  .then(response => {
      this.setState({userData: response.data.data[0]});
    })
    .catch(function (error) {
      that.setState({accessToken: ''});
    });
}

};

这是在 ComponentDidMount 中调用的函数。访问此组件时,我需要检查用户是否已登录。我得到了 accessToken 的值。它在第一个 if 语句中检查是否存在访问令牌。

问题是我没有得到响应,但我发现了错误。相同的代码可以在 iOS 上运行,如果远程 JS 调试打开,它甚至可以在 Android 上运行。但是,如果远程 JS 调试关闭,它就不起作用。提前致谢!

【问题讨论】:

  • async storagecatch 或axioscatch 中的错误来自哪里?以及accessToken在构造函数中的默认值或者它的初始状态是什么?
  • 来自Axios catch。 accessToken 的默认值为空字符串。

标签: reactjs react-native axios asyncstorage


【解决方案1】:

您使用 setState 的方式存在问题,

来自 React 文档,

对 setState 的调用是异步的 - 不要依赖 this.state 来调用 调用 setState 后立即反映新值。

因此在this.setState({accessToken: value}) 之后立即访问this.state.accessToken 可能会给您旧值。

为了解决这个问题,

const value = await AsyncStorage.getItem('access');

在函数内部使用value,在axios响应后使用setState

例如,使用 if(value) 代替 if(this.state.accessToken)

提示:当您不在渲染中使用时,不要在 state 中存储值 看法。无论如何,您不会因此在任何视图中显示 accessToken, 最好不要存放在任何状态。最好将其存储在本地或类中 变化它绰绰有余。

还有其他方法可以解决此问题,但以上方法最适合您的情况。阅读 React 文档了解更多信息。

检查并判断这是否解决了问题。

【讨论】:

  • 感谢您的回复和建议!但是,即使在那之后我仍然卡住了。有趣的是值被正确存储,我可以在 axios 中看到它。我已将其缩小到 index.js 中的这行代码,它允许我在调试器中查看网络请求。 GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;在我删除此行后,即使打开了调试器,它仍然无法进行 api 调用。但是如果调试器打开了这行代码,api调用就会通过,我得到一个响应。关闭调试器,调用失败。
猜你喜欢
  • 1970-01-01
  • 2017-12-23
  • 2015-12-17
  • 2018-09-27
  • 2022-12-11
  • 1970-01-01
  • 2016-10-02
  • 2019-12-04
  • 2019-07-16
相关资源
最近更新 更多