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
相关产品推荐
相关产品推荐

