You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AsyncStorage存储Token后APP重启数据异常问题求助

问题排查与解决办法

嘿,这个问题我太熟悉了——你踩了异步操作处理不当的坑!

问题根源

AsyncStorage.getItem()是一个异步方法,它返回的不是直接的令牌字符串,而是一个Promise对象。你看到的{ "_40":0, "_65":0, "_55":null, "_72":null }其实是React Native实现的Promise内部状态字段,不是错误,只是你直接打印了Promise对象本身,而非它resolve后得到的实际令牌值。

至于重启前看似能拿到正确值,大概率是调试工具的“善意误导”:当Promise已经处于resolved状态时,调试工具会自动展开显示它的最终值,但实际上你的变量token依然是Promise实例,不是实际的字符串。重启后Promise处于初始状态,就直接显示了内部结构。

解决办法

你需要用async/await或者.then()来等待Promise完成,获取真正的令牌值。这里推荐更简洁的async/await写法:

修改你的componentDidMount代码如下:

async componentDidMount() {
  console.warn('Mounting');
  try {
    // 用await等待Promise resolve,拿到实际的令牌值
    const token = await AsyncStorage.getItem('access_token');
    console.warn('获取到的令牌:', token);
    
    if (token !== null) {
      console.log('令牌有效,进入主页面');
      this.props.navigation.navigate('Main'); // 如果需要自动登录跳转
    } else {
      console.log('未找到令牌,需要用户登录');
      // 这里可以跳转到登录页面
    }
  } catch (error) {
    console.error('获取令牌时出错:', error);
  }
}

如果你习惯用.then()链式调用,也可以这么写:

componentDidMount() {
  console.warn('Mounting');
  AsyncStorage.getItem('access_token')
    .then(token => {
      console.warn('获取到的令牌:', token);
      if (token !== null) {
        console.log('令牌有效,进入主页面');
        this.props.navigation.navigate('Main');
      } else {
        console.log('未找到令牌,需要用户登录');
      }
    })
    .catch(error => {
      console.error('获取令牌时出错:', error);
    });
}

额外确认

你的令牌存储代码是正确的——用await AsyncStorage.setItem确保了存储操作完成后再跳转,这部分不需要修改。

内容的提问来源于stack exchange,提问作者user5283119

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:46:47