Как отфильтровать список с помощью lodash, если функция фильтрации асинхронна

Я новичок в lodash и Javascript в целом. Я использую нодджс. Я использую функцию фильтра lodash для фильтрации некоторого содержимого в моей коллекции.

Вот фрагмент

filteredrows = _.filter(rows, function(row, index){

   //here I need to call some asynchronous function which checks the row
   //the return value of this asynchronous function will determine whether to return true or false for the filter function.

});

Мой вопрос в том, как мне это сделать? с помощью замыкания? Можно ли это сделать в функции фильтра lodash? Заранее спасибо.


person brineon    schedule 11.09.2014    source источник
comment
Проще говоря: вы можете использовать асинхронную функцию, если вызывающая функция ожидает синхронную функцию. Итак, теперь вы не можете использовать _.filter   -  person Felix Kling    schedule 11.09.2014
comment
Да, с лодашем это невозможно.   -  person Bergi    schedule 11.09.2014


Ответы (3)


lodash может быть не лучшим инструментом для этой работы. Я рекомендую вам использовать async.

https://github.com/caolan/async#filter

Пример: fs.exists — это асинхронная функция, которая проверяет наличие файла, а затем вызывает обратный вызов.

async.filter(['file1','file2','file3'], fs.exists, function(results){
    // results now equals an array of the existing files
});
person Joe Frambach    schedule 11.09.2014
comment
Вы делаете асинхронные действия! Ваше выступление уже за окном. - person Joe Frambach; 11.09.2014

Lodash не является асинхронным инструментом. Это делает фильтрацию информации в реальном времени очень быстрой. Когда вам нужно сделать процесс асинхронным, вы должны использовать bluebird, Async, собственные промисы или обратные вызовы.

Я думаю, что вы должны использовать Lodash и Underscore только для организации Objectdata в реальном времени.

person Cristian Agudelo    schedule 13.04.2017

Если вы хотите сделать это с помощью lodash вместо установки новой библиотеки (async), вы можете сделать следующее:

const rowFilterPredicate = async (row, index) => {

  // here I need to call some asynchronous function which checks the row
  // the return value of this asynchronous function will determine whether to return true or false for the filter function.

}

// First use Promise.all to get the resolved result of your predicate
const filterPredicateResults = await Promise.all(_.map(rows, rowFilterPredicate));

filteredrows = _.chain(rows)
  .zip(filterPredicateResults) // match those predicate results to the rows
  .filter(1) // filter based on the predicate results
  .map(0) // map to just the row values
  .value(); // get the result of the chain (filtered array of rows)
person Hal Carleton    schedule 24.04.2019