NodeJS Async - 将参数传递给回调

时间:2015-02-19 22:09:52

标签: javascript node.js callback asynccallback

我正在使用NodeJS设置一个刮刀,在使用async.parallel时,我很难找到传递数据的正确方法。

这是批处理函数,它接收zip_results对象内部数组中的邮政编码列表。我正在尝试将数组asyncTasks设置为由async运行的函数数组。我想为每个邮政编码调用的函数是Scraper.batchOne,我想传递一个邮政编码和作业版本。现在,立即调用该函数。我尝试在匿名函数中包含对Scraper.batchOne的调用,但是它丢失了索引变量i的范围并始终以未定义的值发送。

如何将函数传递给数组以及一些参数?

// zip_results: {job_version: int, zip_codes: []}
Scraper.batch = function (zip_results) {
    //tasks - An array or object containing functions to run, each function
    //is passed a callback(err, result) it must call on completion with an
    //error err (which can be null) and an optional result value.
    var asyncTasks = [], job_version = zip_results.job_version;
    for (var i=0; i < zip_results['zip_codes'].length; i++) {
        asyncTasks.push(Scraper.batchOne(zip_results['zip_codes'][i], job_version));
    }
    // Call async to run these tasks in parallel, with a max of 2 at a time
    async.parallelLimit(asyncTasks, 2, function(err, data) { console.log(data); });

};

2 个答案:

答案 0 :(得分:4)

为什么不使用async.eachLimit? (使用async.parallel,您需要使用绑定/应用技术)

async.eachLimit(zip_results['zip_codes'], 2, function(zip, next) {
    Scraper.batchOne(zip, zip_results.job_version));
    return next();
}, function(err) {
     // executed when all zips are done
});

答案 1 :(得分:3)

您可以执行自调用匿名函数,并在调用方法后传递要保留的参数,如下所示:

(function(asyncTasksArr, index, zipResults, jobVersion){
    return function(){
        asyncTasksArr.push(Scraper.batchOne(zipResults['zip_codes'][index], jobVersion));
    }
}(asyncTasks, i, zip_results, job_version));

希望这有帮助。