我不能为我的生活找到答案。如何使用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类似的问题,但答案没有用。我愿意重构,以防我试图做一些不恰当的事情,但这似乎是一件合乎逻辑的事情。
答案 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);
}
});