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

13

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

我有一个var context //object,我需要将它传递给迭代器。我该如何做?

3个回答

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

非常感谢。我会尝试使用iterator.bind(null, context),因为我还需要“item”。 - user644745
1
@user644745 当async.map()调用iterator时,item仍将被传递。.bind()只是在item之前设置了一个额外的参数context - Jonathan Lonowski
明白了。非常感谢。 - user644745
这是关于语言特性的一堂很棒的课程...有点奇怪但很不错。 - Hortinstein
感谢您提供这个出色的答案。我该如何将额外的参数附加到末尾,而不是作为第一个参数? - Abimbola
@Abimbola 你可以使用类似 Lodash 的 partialRight - robertklep

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
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接