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'); }; })