异步.Filter在所有迭代器完成之前调用callback

async.filter is calling callback before all iterators finish

本文关键字:调用 callback 迭代器 Filter 异步      更新时间:2023-09-26

我使用的是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);
    });

得到以下输出:

checking field: 130 
calling field true: 130 
fieldsResults.length=1 
checking field: 131
calling field true: 131 

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

问题是每次都调用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); 

你甚至可以这样缩短过滤器:

callback(item.id == 130 || item.id == 131);

经过更多的实验,我发现问题是回调(false);线。显然,这导致过滤器退出。我想这是有意义的,因为它强制回调被调用。