Пропустить дополнительный аргумент для асинхронной карты

Подпись для async.map - это карта (arr, iterator, callback) (https://github.com/caolan/async#map)

У меня есть var context //object и мне нужно передать это итератору. Как это сделать?

Ответ 1

Вы можете использовать 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);
});

Ответ 2

С функциями стрелки вы можете выполнять свои функции и передавать дополнительные параметры:

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

Ответ 3

С помощью стрелок лучше всего использовать 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
}