将额外的parameter passing给asynchronous映射
async.map的签名是map(arr,iterator,callback)( https://github.com/caolan/async#map )
我有一个var context //object
,我需要传递给迭代器。 我该怎么做呢 ?
您可以通过两种方式使用绑定:
iterator.bind(context)
这将使迭代器函数中的context
可用。
另一种方法是创build一个部分函数:
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); });
使用箭头function,您可以咖喱您的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 });
我喜欢把我的function放在asynchronous函数之外,以保持干净:
const processItem = context => (item, callback) => { // process items here }; async.map([1,2,3], processItem(context)(item, callback), (err, results)=>{ // async.map callback function });