async.filter在所有迭代器完成之前调用回调

akr*_*ymn 1 javascript async.js

我正在使用caolan的async.js.我很困惑为什么在所有迭代器完成之前调用回调.当我运行以下代码时:

  async.filter(matched_objects.fields, function(item, callback) {
      console.log('checking field: ' + item.id);
      if(item.id == 130 || item.id == 131) {
        console.log('calling field true: ' + item.id);
        callback(true);
      } 
      callback(false);
    },
    function(fieldResults) {
      console.log('fieldsResults.length=' + fieldResults.length);
    });
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

checking field: 130 
calling field true: 130 
fieldsResults.length=1 
checking field: 131
calling field true: 131 
Run Code Online (Sandbox Code Playgroud)

对于我来说,results.fields在过滤器循环中检查第二项之前调用回调中的console.log是没有任何意义的.

Mrc*_*ief 6

问题是callback(false)每次都会调用,即使你达到了这个if条件.正确的方法是添加一个return声明:

if(item.id == 130 || item.id == 131) {
  console.log('calling field true: ' + item.id);
  return callback(true);  // now you won't call callback(false) everytime
} 
callback(false); 
Run Code Online (Sandbox Code Playgroud)

您甚至可以通过以下方式缩短过滤器:

callback(item.id == 130 || item.id == 131);
Run Code Online (Sandbox Code Playgroud)