async。<fn>在第一个iteraton循环后限制停止

时间:2016-10-27 21:58:48

标签: node.js asynchronous

这个问题与我previous question的答案有关。 @robertklep建议我使用mapLimit()而不是.map(),因为.map()无法处理大量数据,并且使用该解决方案一切正常。但是现在我重构了我的代码,现在.<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

1 个答案:

答案 0 :(得分:2)

您的首要问题是,您无法在cb的成功分支中致电processBook。您的控制流必须保证为每个工作程序函数调用调用一次回调。

其他旁白:

  • 您似乎不需要结果,所以eachLimit没问题
    • 如果您需要每个工作人员的结果,只需要mapLimit
  • 调用回调时,您需要遵循标准的错误优先约定。不要做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');
    };
})