React Native - вернуть все данные JSON в AsyncStorage?

В моем приложении React Native AsyncStorage у меня есть несколько объектов JSON, каждый с уникальным идентификатором ключа, например:

 '62834456':
 data: { "foo": "bar",
 "nicknames": [ "grizz", "example" ],
 ... and so on }

Они помещены в AsyncStorage в строковом виде. Я пытаюсь получить каждый объект по его идентификатору и вставить идентификатор и его данные JSON в состояние компонента. У меня пока есть это:

// for every key in async storage, push to favorites in state
importData = (id) => {
  for (id in AsyncStorage) {
    return AsyncStorage.getItem(id)
      .then(req => JSON.parse(req))
      .then(json => console.log(json))
      .catch(error => console.log('error!'));
  }
}

Когда console.logging 'json' в приведенной выше функции, результат равен нулю. Как я могу правильно получить доступ ко всем объектам JSON в моем AsyncStorage?

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Использование вашего примера кода и удаление JSON.parse (просто console.logging req) возвращает следующее: введите описание изображения здесь

Похоже, это происходит потому, что по какой-то причине .forEach возвращает первую строку в массиве, сам массив, а затем вторую строку.


person zahnzy    schedule 10.01.2018    source источник


Ответы (5)


Чтобы получить все ключи AsyncStorage, вам нужно вызвать AsyncStorage.getAllKeys(). Чтобы ускорить процесс, вы также должны использовать AsyncStorage.multiGet(). Делая это, ваш код становится;

importData = async () => {
  try {
    const keys = await AsyncStorage.getAllKeys();
    const result = await AsyncStorage.multiGet(keys);

    return result.map(req => JSON.parse(req)).forEach(console.log);
  } catch (error) {
    console.error(error)
  }
}
person H. Tugkan Kibar    schedule 10.01.2018
comment
Похоже, что в этом случае id не используется, нужно ли мне его где-то определять, прежде чем передавать в importData ()? - person zahnzy; 12.01.2018
comment
Ключ - это идентификатор, вы можете использовать обычный getItem, поскольку ключи - это просто массив идентификаторов, и соедините их таким образом. - person H. Tugkan Kibar; 12.01.2018
comment
Спасибо за помощь. На данный момент у меня возникают проблемы с отображением вещей в консоли после синтаксического анализа .. т.е. в вашем примере, если я console.log (req), ничего не будет отображаться, даже общий ответ объекта, консоль пуста. Разве это не правильный способ просмотра этих объектов после анализа? - person zahnzy; 13.01.2018
comment
Не могли бы вы проверить, что находится в ключах? Возможно, еще ничего не установлено. - person H. Tugkan Kibar; 13.01.2018
comment
Я отредактировал свой исходный пост, чтобы предоставить вам как можно больше информации - person zahnzy; 13.01.2018
comment
@zahnzy Если вы посмотрите на написанный мной код, вы можете заметить, что я использую result.map. Причина этого проста, в результате multiget представляет собой массив строк. Вам нужно проанализировать каждую из них. В своем коде вы пытаетесь преобразовать массив в json, который возвращает значение null. - person H. Tugkan Kibar; 13.01.2018
comment
Зачем смешивать async / await с then и обратными вызовами? Почему бы не пройти весь путь, как в ответе @georgekpc? - person cammil; 08.12.2019
comment
Это ответ годовой давности, поэтому я не могу вспомнить, в чем заключалась идея. Но у тебя есть смысл обновлять. - person H. Tugkan Kibar; 09.12.2019

вот более элегантный способ получить все элементы с помощью функций async / await

const fetchAllItems = async () => {
    try {
        const keys = await AsyncStorage.getAllKeys()
        const items = await AsyncStorage.multiGet(keys)

        return items
    } catch (error) {
        console.log(error, "problemo")
    }
}
person georgekpc    schedule 02.07.2018

Может быть, немного прямолинейно использовать обещания.

import { AsyncStorage } from 'react-native';

  AsyncStorage.getAllKeys()
    .then((keys)=> AsyncStorage.multiGet(keys)
                    .then((data) => console.log(data)));

Ваше здоровье!

person Ram Grandhi    schedule 27.05.2020

Код для возврата объекта json

    try {
        const keys = await AsyncStorage.getAllKeys()
        const itemsArray = await AsyncStorage.multiGet(keys)
        let object = {}
        itemsArray.map(item => {
          object[`${item[0]}`] = item[1]
        })
        return object
    }   catch (error) {
        console.log(error, 'error')
    }
person Dayal Saini    schedule 07.08.2019

Что мне не понравилось в текущих ответах, так это то, что он возвращает массив массивов, что затрудняет поиск определенного ключа. Вот что я предпочитаю использовать:

const getAll = async () => {
  try {
    const result: any = {};
    const keys = await AsyncStorage.getAllKeys();
    for (const key of keys) {
      const val = await AsyncStorage.getItem(key);
      result[key] = val;
    }
    return result;
  } catch (error) {
    alert(error);
  }
};

Это вернет объект со всеми ключами, которые у вас есть, и их соответствующими значениями.

person Hossam Mourad    schedule 15.08.2020