React Native AsyncStorage: использование await и async - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь получить все ключи из моей базы данных 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 
}

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

1 Ответ

0 голосов
/ 08 февраля 2019

Вы должны на самом деле вернуть что-то из вашего 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
  }
}
...