如果过滤器函数是异步的,如何使用lodash过滤列表

时间:2014-09-11 15:46:54

标签: javascript node.js lodash

我是lodash和Javascript的新手。我正在使用nodejs。 我正在使用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过滤器功能中执行此操作? 提前谢谢。

3 个答案:

答案 0 :(得分: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
});

答案 1 :(得分:0)

Lodash不是异步工具。它可以快速实时过滤信息。当您需要使进程异步时,必须使用bluebirdAsync,本机承诺或回调。

我认为您应该使用Lodash和Underscore,只能实时组织Objectdata。

答案 2 :(得分:0)

如果要使用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)