AsyncStorage.getItem返回undefined:React Native

时间:2015-12-02 19:22:16

标签: reactjs undefined react-native

Codeflow是 -

我正在检查AsyncStorage中是否存在名为 listobject 的条目。

  1. 如果它不存在,那么,我创建一个对象,添加一些属性并设置商店。我得到商店 obj ,因为我必须在下一个 if 条件下进行比较。

  2. 如果 listobject 条目已存在(第2次),则直接进入第2个区块并进行比较。 (我在第一步获得obj值的原因是因为我可以有一个共同的 obj.data.isdirty 条件。

  3. 这是我的代码 -

    AsyncStorage.getItem('listobject').then((obj) => {
        if(obj == undefined)
        {
            var obj1 ={};
            obj1.data ={};
            obj1.data.isdirty = true;
            console.log("obj1 = "+ JSON.stringify(obj1));
            AsyncStorage.setItem('listobject',obj1);
            obj = AsyncStorage.getItem('listobject');
            console.log("obj = "+ JSON.stringify(obj));
        }
        if(obj.data.isdirty)
        {
            obj.data.isdirty = false;
            AsyncStorage.setItem('listobject',JSON.stringify(obj));
            return AsyncStorage.getItem('listobject');
        }
    }).done();
    

    我有2个问题是同一问题的结果 -

    1. 日志。我正在设置obj1并为obj获取相同的值(以便我可以比较下一个if条件)。为什么我无法获得设置相同的价值?
    2.   

      12-03 00:27:56.281 32598-487 / com.abc D / ReactNativeJS:' obj1 = {" data":{" isdirty":true} }'

           

      12-03 00:27:56.286 32598-487 / com.abc D / ReactNativeJS:' obj = {" _37":0," _12":null " _59":[]}'

      1. 这是上述日志的最终结果。我得到的是list.data.isdirty未定义。我想这是因为我访问的JSON格式在 obj 中不存在,即obj.data.isdirty不存在。那么,我该如何克服这个?
      2.   

        undefined不是对象(评估' list.data.isdirty');

        请告诉我,我做错了什么?

2 个答案:

答案 0 :(得分:4)

我实际上是将对象从一个复制到另一个。它奏效了。

AsyncStorage.getItem('listobject').then((obj) => {
    if(obj == undefined)
    {
        var obj1 ={};
        obj1.data ={};
        obj1.data.isdirty = true;
        console.log("obj1 = "+ JSON.stringify(obj1));
        AsyncStorage.setItem('listobject',obj1);
        obj = obj1; //THIS IS WHAT I DID!
        console.log("obj = "+ JSON.stringify(obj));
    }
    if(obj.data.isdirty)
    {
        obj.data.isdirty = false;
        AsyncStorage.setItem('listobject',JSON.stringify(obj));
        return AsyncStorage.getItem('listobject');
    }
}).done();

答案 1 :(得分:0)

我并不完全遵循我所做的整个问题,但是看到使用AsyncStorage的问题。按照名称,Async意味着操作是异步的。因此,当你执行getItem(key)时,你应该传入一个回调函数,或者使用它在第一行代码中返回的Promise对象。

obj = AsyncStorage.getItem('listobject'); console.log("obj = "+ JSON.stringify(obj));

在这种情况下,

obj将成为Promise。

然后,如果你检查obj是否存在数据和isDirty子属性,它们将不会存在于Promise上。