在 AsyncStorage.getItem 方法中使用 promise 的正确方法是什么?

what is the correct way to use promise in AsyncStorage.getItem method?

我一直在尝试使用 getItem() 方法获取 AsyncStorage 中的值。

我创建了一个切换导航器。如下。

export const AuthNavigator = createSwitchNavigator(
  {
    AuthLoading: AuthLoadingScreen, // Loading screen
    App:DrawerNavigator, //screens with drawer navigator
    Auth: AuthStack, // login screen
  },
  {
    initialRouteName: 'AuthLoading',
  }
);

我已将 AuthLoading 设置为初始路由。下面是我的 AuthLoadingScreen 代码。

export default class AuthLoadingScreen extends React.Component {
  constructor(props) {
    super(props);

    this._promiseHandling();
  }
  _promiseHandling = () => {
      AsyncStorage.getItem("userToken").then((value) => {
      console.log(value);
      if(value!=undefined){
        this.props.navigation.navigate("App");
      }
      else{
        this.props.navigation.navigate("Auth");
      }
    })
      .catch(res => {
        console.log(res);

      });

  }

  // Render any loading content that you like here
  render() {
    return (
      <View style={styles.container}>
        <ActivityIndicator />
        <StatusBar barStyle="default" />
      </View>
    );
  }
}

所以,最初我正在检查来自 AsyncStorage 的 userToken 的值。如果它在那里,我正在导航到应用程序。如果它不存在,那么我将导航到登录屏幕。

应用行为应如上。

但是当应用加载时,它总是停留在AuthLoadingScreen。我试图调试我从异步存储中获取 userToken 的代码,但对我来说很奇怪,控制将转到函数 _promiseHandling 但之后它不会进入 then赶上块。 我参考了 5-6 个示例来从异步存储中读取值并处理它的承诺。

我什至尝试了以下方法,但它仍然不适合我。

async _getStorageValue(){
  var value = await AsyncStorage.getItem('ITEM_NAME')
  return value
}

这背后的原因是什么?

试试这个。

export default class AuthLoadingScreen extends React.Component {

  constructor(props) {
    super(props);
    this._promiseHandling();
  }

  _promiseHandling = async () => {

    try {

      const token = await AsyncStorage.getItem('userToken');

      if (token)
        this.props.navigation.navigate("App");
      else
        this.props.navigation.navigate("Auth");

    } catch (error) {
      console.log(error);
    }

  }

  // Render
}

确保您在使用前已正确导入 AsyncStorage,并且您可以访问设备存储。此外,请确保您的 AuthLoadingScreen 已收到 navigation 道具,然后才能调用它。

如果问题仍然存在,post这里的错误。