Arhn - архитектура программирования

Функция возврата асинхронного хранилища вместо значений

Я пытаюсь использовать AsyncStorage в моем собственном приложении для реагирования и не знаю, почему не работает.

В основном я хочу, чтобы индексированный массив (или любая пара ключ-значение) хранился в asyncstorage с истинным или ложным значением для каждого добавленного элемента.

import {AsyncStorage} from 'react-native';

....

componentDidMount() {
    this.storeData('favourites', []);
}

addOrRemove(id) {
    let favourites = this.getData('favourites');
    console.log('favourites getted: ', favourites);
    favourites[id] = favourites[id] ? false : true; //this logic is working fine
    this.storeData('favourites', favourites);
}

getData и storeData:

 storeData = (key, value)  => async () => {
        try {
            await AsyncStorage.setItem(key, value);
        } catch (e) {
          // saving error
        }
    };

    getData = key => async () => {
        try {
          const value = await AsyncStorage.getItem(key)
          return value;
        } catch(e) {
          // error reading value
        }
    };

Это то, что я получаю, когда делаю console.log ('избранное получено:', избранное);

favourites getted:  function _callee2() {
      var value;
      return _regenerator.default.async(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              _context2.prev = 0;
              _context2.next = 3;
              return _regenerator.default.awrap(_reactNative.AsyncStorage.getItem(key));

            case 3:
              value = _context2.sent;
              return _context2.abrupt("return", value);

            case 7:
              _context2.prev = 7;
              _context2.t0 = _context2["catch"](0);

            case 9:
            case "end":
              return _context2.stop();
          }
        }
      }, null, null, [[0, 7]]);
    }

Когда кто-то нажимает на определенную кнопку, запускается метод addOrRemove(id). Я хочу получить массив, который я сохранил в моем AsyncStorage, и указать истину или ложь в позиции идентификатора этого массива.

Почему я получаю эту функцию из AsyncStorage, а не из индексированного массива, который мне нужен?

Я думаю, что это может быть проблема async / await, но не знаю, в чем проблема.


  • вы знаете, что getData возвращает обещание? 04.12.2019
  • Ага, вот почему я делаю const value = await AsyncStorage.getItem(key) в getData, а затем возвращаю значение. Возможно, я ошибаюсь, но при использовании await value должен быть массивом, а не обещанием, верно? 04.12.2019
  • вы определяете getData как саму асинхронную функцию, то, что вы ждете, - это не getData. Вы ждете AsyncStorage.getItem, который является еще одним асинхронным вызовом. Я не очень знаком с досягаемостью, но с точки зрения JS вам также нужно дождаться getData или установить значение из тела 04.12.2019
  • Конечно, вы ждете внутри асинхронной функции ... но сама асинхронная функция возвращает обещание (это то, что я сказал, ничего общего с тем, что возвращает getItem, я сказал, что getData возвращает обещание) ... поэтому let favourites = this.getData('favourites'); `избранное ' это обещание 05.12.2019

Ответы:


1

Ваши функции storeData и getData возвращают асинхронную функцию, вы можете упростить:

 storeData = async (key, value) => {
   try {
     await AsyncStorage.setItem(key, value);
   } catch (e) {
     // process error
   }
 };

 getData = async (key) => {
   try {
     const value = await AsyncStorage.getItem(key)
     return value;
   } catch (e) {
     // process error
   }
 };

И используйте их с async / await:

componentDidMount() {
  this.storeData('favourites', []);
}

async addOrRemove(id) {
  try {
    let favourites = await this.getData('favourites');
    console.log('favourites getted: ', favourites);
    favourites[id] = favourites[id] ? false : true;
    await this.storeData('favourites', favourites);
  } catch (err) {
    //process error
  }
}
04.12.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..