React native - Как фильтровать массив асинхронно (async / await) - PullRequest
0 голосов
/ 02 июля 2018

У меня есть метод фильтра:

_filterItems(items) {
  return items.filter(async item => {
    let isTrue = await AsyncStorage.getItem('key');
    return isTrue;
  })
}

Вызовите метод this._filterItems (myItemsAsArray) всегда возвращает неопределенное значение.

Как я могу заставить его работать как положено?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я предполагаю под AsyncStorage.getItem('key'); вы имели в виду AsyncStorage.getItem(item);

async function run(){
    let result =  await Promise.all(items.map((item)=>AsyncStorage.getItem(item)));
  result = result.filter(Boolean); // filter all non-truthy values
  console.log('result',result);

}

run();

вот оно https://jsfiddle.net/2juypmwL/1/

Технически, вы можете сделать его еще короче:

async function run(){
    let result =  (await Promise.all(items.map(AsyncStorage.getItem))).filter(Boolean);
  console.log('result',result);
}

run();
0 голосов
/ 02 июля 2018

Нельзя использовать асинхронную функцию с методом массива .filter напрямую, поскольку этот метод ожидает возврата логического значения, но асинхронная функция всегда будет возвращать обещание. Вместо этого вы можете предоставить для него простую оболочку, которая сначала разрешит обещания, а затем использует результат этих обещаний в качестве условия фильтра.

Пример:

const items = Array(10).fill().map((_, i) => i);

function asyncFilter(arr, func) {
  return Promise.all(arr.map(func)).then(boolArr => arr.filter((_, i) => boolArr[i]));
}

asyncFilter(items, async n => Boolean(n % 2)).then(result => console.log(result))
...