AsyncStorage.getItem 返回 undefined:React Native

5

Codeflow是-

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

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

  2. 如果listobject条目已经存在(第二次),则直接进入第二个块并进行比较。(我在第一步中获取值到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();

我有两个问题,这是同一个问题的结果-

  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 is not an object (evaluating 'list.data.isdirty');

请告诉我我做错了什么?


返回的 obj 是一个字符串,所以在第二个 if 之前必须对其应用 JSON.parse。 - ivillamil
1
我也尝试过了,但不起作用。 - bozzmob
3个回答

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

0

我不太明白整个问题,但我看到使用AsyncStorage存在一个问题。根据名称,Async意味着操作是异步的。因此,当您执行getItem(key)时,应该传递回调函数或使用它返回的Promise对象,就像您在代码的第一行中所做的那样。

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

obj 在这种情况下将是Promise。

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


如果我没错的话,我应该使用obj作为- obj.then(function(){code});。 - bozzmob
是的,我使用了普通的对象分配方法,它起作用了。我已经更新了问题并附上了我的解决方案。谢谢 :) - bozzmob

0
有时候在执行 console.log(AsyncStorage.getItem('Soomekey')) 时,你会得到 undefined 的结果。这是因为不能直接从 AsyncStorage 中获取值,它返回的是一个 Promise。所以你应该写成:
 const SomeFunction = async () => {
    try {
      const value = await AsyncStorage.getItem('somekey');
      console.log(value);
    } catch (err) {
      console.log(err);
    }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接