AsyncStorage返回不正确的值

时间:2016-06-22 12:18:09

标签: javascript react-native asyncstorage

我是一个非常新的反应原生,可能是完全错误的做法。 正如反应原生文档所建议的,我正在使用AsyncStorage的包装器。 我在做什么:

  1. 我有一个名为Storage的类,它作为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. 另一个类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;
        }    
    }
    
  3. 理想情况下,因为存在键'auth'的值,所以它应该打印“Authkey exists”并且应该将keyExists返回为true。但它恰好相反。

    On进一步的诊断我发现函数authKeyExists在promise对象内的代码执行之前就会返回。

    我已经看过几个例子,但他们都在Screen组件本身上使用了AsyncStorage(我也尝试过这个例子并且失败了)。我想通过使用我的存储类来抽象出AsyncStorage。请告诉我错误的地方。

1 个答案:

答案 0 :(得分:0)

你的函数authKeyExists()将始终返回true ... promise中的函数异步运行并且在返回keyExists后实际触发,因此设置keyExists的逻辑中没有任何逻辑会产生任何影响。如果要使用承诺中的值,则需要使用回调:

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

});