React Native AsyncStorage: использование await и async

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

Эта функция возвращает ключи в массиве:

DATABASE_getAllCoffeeEntries =  () => {
    AsyncStorage.getAllKeys((err, keys) => {})
    .then(keys => {
      AsyncStorage.multiGet(keys, (error, items) => { 
       return items;
      }).then(items => {
        return items; // array of items is returned
      });
  });
 }

и эта функция предназначена для вызова указанной выше функции, затем ожидания результата и фильтрации данных.

somefunc = async () => {
  var items = await DATABASE_getAllCoffeeEntries();
  var someItems = items.filter(function (result, i, item) {
          // do filtering stuff
          return item;
    });

    // do something with filtered items 
}

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


person Benjamin    schedule 08.02.2019    source источник
comment
getAllCoffeeEntries должен быть асинхронной функцией, вызываемой с ключевым словом await,   -  person Shabbir Haider    schedule 08.02.2019


Ответы (1)


Вам действительно нужно что-то вернуть из своего DATABASE_getAllCoffeeEntries

Вы могли бы сделать что-то подобное.

  1. Сначала мы помещаем ваш звонок внутрь обещания. Что будет resolve, если мы получим все элементы от AsyncStorage или reject, если возникнет проблема.
  2. Убедитесь, что наши вызовы AsyncStorage находятся внутри try/catch. await вызовы могут вызывать ошибки, поэтому нам нужно убедиться, что мы обрабатываем любые ошибки.
  3. Используйте async/await при получении элементов от AsyncStorage, так как это позволяет использовать callbacks, которые захватывают ответы от AsyncStorage. Это также может упростить чтение вашего кода.

Вот рефакторинг

DATABASE_getAllCoffeeEntries = () => {
  return new Promise( async (resolve, reject) => {
    try {
      let keys = await AsyncStorage.getAllKeys();
      let items = await AsyncStorage.multiGet(keys)
      resolve(items)
    } catch (error) {
      reject(new Error('Error getting items from AsyncStorage: ' + error.message))
    }
  });
}

Затем мы можем вызвать такую ​​функцию, хотя нам придется заключить ее в try/catch, поскольку она может бросать.

somefunc = async () => {
  try {
    var items = await this.DATABASE_getAllCoffeeEntries();
    var someItems = items.filter(function (result, i, item) {
          // do filtering stuff
          return item;
    });
    // do something with filtered items 
  } catch (error) {
    // do something with your error
  }
}
person Andrew    schedule 08.02.2019
comment
И это причина, по которой я задаю вопросы в стеке, спасибо! это действительно очень помогает, и мне нравится чистый способ вызова AsyncStorage DB, такой простой для чтения! Спасибо еще раз! - person Benjamin; 08.02.2019
comment
Я рада, что это вам помогло. promises и async/await могут быть непростыми. Это неплохая статья medium .com / @ bluepnume / - person Andrew; 08.02.2019
comment
Спасибо за ссылку! изучу его досконально! приведенный выше код работает отлично! как только this. добавлен к вызываемой функции БД в somefunc() (это была моя ошибка) - person Benjamin; 08.02.2019
comment
Да, я тоже это пропустил. Я просто скопировал ваш код и добавил try/catch. Я исправил это в своем ответе - person Andrew; 08.02.2019