async。<fn>在第一次迭代循环后限制停止

这个问题与我上一个问题的答案有关 。 有@robertklepbuild议我使用mapLimit()而不是.map()因为.map()不能处理大量的数据,并且解决scheme一切正常。 但是现在我重构了我的代码,现在在第一次循环迭代之后, .<fn>Limit()函数都没有运行。 我在这里错过了什么吗?

 var proccesBook = function(file, cb) { testFile(file, function (epub) { if (epub) { getEpuData(file, function (data) { insertBookInDB(data) }) }else{ cb(file) } }) } async.mapLimit(full_files_path, 10, proccesBook, function(err){ if(err){ console.log('Corrupted file', err); } else { console.log('Processing complete'); }; }) // ---> only runs for the first 10 series data 

你的主要问题是你不要在processBook的成功分支中调用cb 。 您的控制stream程必须保证每次调用worker函数都要调用一次callback函数。

其他旁白:

  • 你似乎不需要结果,所以eachLimit是好的
    • 只需要mapLimit如果你需要每个工人的结果
  • 调用callback函数时,您需要遵循标准的错误优先约定。 不要做cb(file)因为这将被解释为错误和剩余的处理。

 var proccesBook = function(file, cb) { testFile(file, function (epub) { if (epub) { getEpuData(file, function (data) { insertBookInDB(data) cb() // This is what you were missing }) }else{ cb() } }) } async.eachlimit(full_files_path, 10, proccesBook, function(err){ if(err){ console.log('Corrupted file', err); } else { console.log('Processing complete'); }; })