【问题标题】:AsyncStorage.getItem returns undefined : React NativeAsyncStorage.getItem 返回 undefined : React Native
【发布时间】:2015-12-02 19:22:15
【问题描述】:

代码流是-

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

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

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

这是我的代码-

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 条件)。为什么我无法获得与我设置相同的值?

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 不存在。那么,我该如何克服呢?

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

请告诉我我做错了什么?

【问题讨论】:

  • 返回的obj是一个字符串,所以你必须在第二个if之前对其应用JSON.parse。
  • 我也试过了,还是不行。

标签: reactjs undefined react-native


【解决方案1】:

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

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();

【讨论】:

    【解决方案2】:

    我并没有完全关注整个问题,但我确实看到了使用 AsyncStorage 的问题。顾名思义,Async 意味着操作是异步的。因此,当您执行 getItem(key) 时,您应该传入一个回调或使用它返回的 Promise 对象,就像您在第一行代码中所做的那样。

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

    obj 在这种情况下将成为 Promise。

    然后,如果您检查 obj 是否存在 data 和 isDirty 子属性,它们将不会存在于 Promise 中。

    【讨论】:

    • 如果我是对的,我应该使用 obj 作为 - obj.then(function(){code});
    • 是的。我使用了一个普通的对象分配并且它有效。用我的解决方案更新了问题。谢谢:)
    猜你喜欢
    • 2018-02-28
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多