如何将参数传递给async.each的迭代器函数?

时间:2013-06-07 17:53:54

标签: node.js

我不能为我的生活找到答案。如何使用caolan的async.js节点模块将参数传递给async.each的迭代器函数?我想重用迭代器,但它需要根据上下文使用不同的前缀保存。我得到的是:

async.each(myArray, urlToS3, function(err){
    if(err) {
       console.log('async each failed for myArray');
    } else {
        nextFunction(err, function(){
            console.log('successfully saved myArray');
            res.send(200);
        });
    }
});

function urlToS3(url2fetch, cb){
    //get the file and save it to s3
}

我希望能够做的是:

    async.each(myArray, urlToS3("image"), function(err){
    if(err) {
       console.log('async each failed for myArray');
    } else {
        nextFunction(err, function(){
            console.log('successfully saved myArray');
            res.send(200);
        });
    }
});

function urlToS3(url2fetch, fileType, cb){
    if (fileType === "image") {
    //get the file and save it to s3 with _image prefix
    }
}

我发现了一个与coffeescript类似的问题,但答案没有用。我愿意重构,以防我试图做一些不恰当的事情,但这似乎是一件合乎逻辑的事情。

2 个答案:

答案 0 :(得分:15)

您可以使用bind创建部分功能:

async.each(myArray, urlToS3.bind(null, 'image'), ...);

参数'image'将作为函数的第一个参数传递(其余参数将是async传递的参数),所以它看起来像这样:

function urlToS3(fileType, url2fetch, cb) {
  ...
}

答案 1 :(得分:0)

我刚刚在iteratee函数上使用bind方法解决了它,下面是完整的工作示例:

var recordsToIterate = [
    {'id':"101", 'address':"Sample 1"},
    {'id':"102", 'address':"Sample 2"},
];

var person = {'name': "R", 'surname': "M"};

var funcProcessor = function(person, record, next){
    console.log(person); // object from recordsToIterate
    console.log(record); // person object
    next();
};

async.each(
    recordsToIterate,
    funcProcessor.bind(null, person),
    function(err){

    if(err){
        console.log(err);
    }
});