AsyncStorage returns 不正确的值

AsyncStorage returns incorrect value

我对 React Native 很陌生,可能做错了。 正如 React Native 文档中所建议的那样,我正在为我的 AsyncStorage 使用一个包装器。 我在做什么:

  1. 我有一个名为 class 的存储,它用作 AsyncStorage 的包装器 代码:

    'use strict';
    var React = require('react-native');
    var {
        AsyncStorage
    } =React;
    
    module.exports={
        store(key,value)
        {
            AsyncStorage.setItem(key,value);
        },
        get(key)
        {
            return AsyncStorage.getItem(key);
        },
    }
    
  2. Another class Auth 查找具有密钥 auth 的值(已保存) 代码:

    'use strict';
    var React = require('react-native');
    
    var Storage=require('./Storage');
    module.exports={
        authKeyExists()
        {
          console.log("IntelliSpend: In Auth::authKeyExists");
          var authKeyPromise=Storage.get('auth');
          var keyExists=true;      
          authKeyPromise.then((authKey)=>{
              console.log('Authkey:'+authKey);
              if(authKey){
                console.log('Authkey exists');
                keyExists= true;
              }
              else {
                console.log('Authkey does not exists');
                keyExists= false;
              }
          }).done();      
          return keyExists;
        }    
    }
    

理想情况下,键 'auth' 的值存在,因此它应该打印 "Authkey exists" 并且 return keyExists 应该为真。但恰恰相反。

在 Further diagnosys 上,我发现函数 authKeyExists return 早于 promise 对象中的代码执行。

我看过几个示例,但它们都在 Screen 组件本身上使用了 AsyncStorage(我也尝试过但失败了)。我想通过使用我的存储 class 抽象出 AsyncStorage。请让我知道我错在哪里。

您的函数 authKeyExists() 将始终 return true... promise 中的函数 运行 是异步的,并且实际上会在 return keyExists 之后触发,因此 none那里设置 keyExists 的逻辑将产生任何影响。如果您想使用 promise 中的值,您需要使用回调:

authKeyExists(callback)
{
  var keyExists;
  var authKeyPromise=Storage.get('auth');
  authKeyPromise.then((authKey)=>{

      if(authKey){
        keyExists= true;
      }
      else {
        keyExists= false;
      }

      callback(keyExists);

  }).done();      
}    

然后你可以像这样使用:

Auth.authKeyExists( (keyExists)=> {

   // do something with keyExists

});