async.map的签名为map(arr, iterator, callback) (https://github.com/caolan/async#map)
我有一个var context //object
,我需要将它传递给迭代器。我该如何做?
async.map的签名为map(arr, iterator, callback) (https://github.com/caolan/async#map)
我有一个var context //object
,我需要将它传递给迭代器。我该如何做?
你可以用bind,有两种方式:
iterator.bind(context)
这将使得迭代器函数中的context
作为this
可用。
另一种方法是创建一个部分函数:
iterator.bind(null, context)
这将使得context
作为迭代器函数的第一个参数可用。所以,迭代器的签名从iterator(item, callback)
变为iterator(context, item, callback)
。
简单演示:
// first:
async.map([1, 2, 3], function(item, callback) {
callback(null, item * this.mult);
}.bind({ mult: 5 }), function(err, results) {
console.log('R', results);
});
// second:
async.map([1, 2, 3], function(ctx, item, callback) {
callback(null, item * ctx.mult);
}.bind(null, { mult: 5 }), function(err, results) {
console.log('R', results);
});
使用箭头函数的最佳实践是使用async.apply。 async.apply提供了添加额外参数的能力,这些参数将作为第一个参数传递给目标函数。以下是示例代码:
processItemFuction(context, item, callback) {
//Here you can access context as well
}
async.map([1,2,3]), async.apply(processItemFuction, context), (err, res) {
// async.map callback function
}
使用箭头函数,您可以对函数进行柯里化并传递额外的参数:
async.map([1,2,3], context => (item, callback) => {
// you now have access to context, item, and callback here
}, (err, results)=>{
// async.map callback function
});
我喜欢将我的函数放在异步函数外面,以保持代码整洁:
const processItem = context => (item, callback) => {
// process items here
};
async.map([1,2,3], processItem(context)(item, callback), (err, results)=>{
// async.map callback function
});
async.map()
调用iterator
时,item
仍将被传递。.bind()
只是在item
之前设置了一个额外的参数context
。 - Jonathan LonowskipartialRight
。 - robertklep