AsyncStorage 在第一次启动时不 return null

AsyncStorage doesn't return null at first start

我正在使用 JWT 和 deviceStorage 进行登录,它工作正常,但每次我启动应用程序,并且从 deviceStorage 中删除 JWT 时,它开始时就好像已经登录了一样。问题是 get 方法在 deviceStorage return 中是一个承诺,所以我需要将 get 方法 return 设置为空,或者让我的程序知道它是字符串还是承诺

APP.JS

import 'react-native-gesture-handler';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import React, { useState, useEffect } from 'react';
import Login from './src/Pages/Login';
import LoggedIn from './src/Pages/LoggedIn';
import deviceStorage from './src/Service/deviceStorage';

const App = () => {
  
  const [JWT, setJWT] = useState(null);

  useEffect(() => {
    const checkJWT = () => {
    setJWT(deviceStorage.getValue())
  }
  checkJWT()
  }, []

  );
  
  const checkJWT = () =>{
    if (!JWT || JWT === null || JWT === "") {
      return <Login setJWT={setJWT} />
    }else if (JWT){
      return <LoggedIn JWT={JWT} setJWT={setJWT} />
    }
  }

  return (
    <SafeAreaProvider>
    {checkJWT()}
    </SafeAreaProvider>
  )
}

export default App

设备存储

import AsyncStorage from '@react-native-async-storage/async-storage';
const key = 'currentUser';

const deviceStorage = {
  
    async saveItem(value) {
        try {
          const jsonValue = JSON.stringify(value)
          await AsyncStorage.setItem(key, jsonValue);
        } catch (error) {
          console.log('AsyncStorage Error: ' + error.message);
        }
        console.log('Done saving Value.')
      },

      async getValue() {
        try {
          return await AsyncStorage.getItem(key)
        } catch(e) {
          console.log('AsyncStorage Error: ' + e.message);
        }
      
        console.log('Done getting value.')
      },
      async removeValue() {
        try {
          await AsyncStorage.removeItem(key)
        } catch(e) {
          console.log('AsyncStorage Error: ' + e.message);
        }
      
        console.log('Done removing Value.')
      }

      
};

export default deviceStorage;

我希望有人能帮我解决这个问题

试试这个功能:

async getValue() {
        try {
           let value = null;
           value = await AsyncStorage.getItem(key);
           return value;
        } catch(e) {
          console.log('AsyncStorage Error: ' + e.message);
        }
      
        console.log('Done getting value.')
      }

正如您所指出的,deviceStorage returns 的 get 方法目前是一个承诺。我认为您可以执行以下操作之一:

如果 useEffect 可以接受 async 方法,我认为这应该可行:

useEffect(async () => {
    const checkJWT = () => {
        setJWT(await deviceStorage.getValue())
    }
    checkJWT()
}, []);

如果没有,那么这样的事情应该可行:

useEffect(() => {
    const checkJWT = () => {
       deviceStorage.getValue().then(value => setJWT(value));
    }
    checkJWT()
  }, []);

我还没有在任何地方检查过它是否有效,但按照这些思路应该可以解决问题。您应该确保确实在 setJWT 方法中放置了 JWT 而不是 Promise。或者你可以改变你的 setJWT 方法,让它知道,如果它收到了承诺,那么你必须等待结果。