将额外参数传递给异步映射

时间:2014-01-02 12:22:31

标签: javascript node.js async.js

async.map的签名是map(arr,iterator,callback)(https://github.com/caolan/async#map

我有var context //object 我需要将它传递给迭代器。我该怎么做?

3 个答案:

答案 0 :(得分:23)

您可以通过两种方式使用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);
});

答案 1 :(得分:0)

使用箭头功能,您可以调整功能并传入额外的参数:

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
});

答案 2 :(得分:0)

使用箭头功能,最佳做法是使用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
}
相关问题