2015-12-02 2 views
4

CodeflowAsyncStorage.getItem возвращает неопределенное значение: Реагировать Native

это-

Я проверяю, если запись называется ListObject существует в AsyncStorage.

  1. Если этого не существует, создайте объект, добавьте несколько атрибутов и установите хранилище. Я получаю магазин до obj, так как мне нужно сравнить в следующем если состояние.

  2. Если запись listobject уже существует (второй раз), то она непосредственно поступает во 2-й блок и сравнивается. (Причина я получаю значения в OBJ в 1-ом этапе, потому что я могу иметь общую 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. Logs. Я устанавливаю obj1 и получить такое же значение для OBJ (так что я могу сравнить следующий, если условие). Почему я не в состоянии получить такое же значение, что у меня есть комплект?

12-03 00: 27: 56.281 32598-487/com.abc D/ReactNativeJS: 'obj1 = { "данные": { "isdirty": истинно}}'

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

  1. Это конечный результат приведенных выше журналов. Я получаю, что list.data.isdirty не определено. Я предполагаю, что поскольку формат JSON, к которому я обращаюсь, не существует в obj i.e, obj.data.isdirty не существует. Итак, как мне это преодолеть?

неопределенный не является объект (оценка 'list.data.isdirty');

Скажите, пожалуйста, что я делаю неправильно?

+0

Возврат obj является строкой, поэтому вам необходимо применить JSON.parse к ней до второго, если. – ivillamil

+1

Я тоже пробовал, что он не работает. – bozzmob

ответ

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 (ключ), вы должны либо пройти обратный вызов, либо использовать объект Promise, который он возвращает, как вы делаете в первой строке кода.

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

obj будет Обещание в данном случае.

Тогда, если вы проверите obj для наличия данных и является девичью дочернее свойство, они не будут существовать в Promise.

+0

Если я прав, должен ли я использовать obj as - obj.then (function() {code}); – bozzmob

+0

Я объясню код лучше. Дайте мне минуту. – bozzmob

+0

Да. Я использовал обычный объект, и он работал. Обновлен вопрос с моим решением. Благодаря :) – bozzmob

Смежные вопросы