Подпись для async.map - это карта (arr, iterator, callback) (https://github.com/caolan/async#map)
У меня есть var context //object
и мне нужно передать это итератору. Как это сделать?
Подпись для async.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.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.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
}