3

I can't to find a method of async.js library for followed:

I have:

  • keys array ['a', 'b', 'c']
  • iterator like:
    function it(item, next){
      next(null, item+item);
    }

If I use async.map([1, 5], it, cb), I get [2, 10].

How can I get { 1: 2, 5: 10 } in this case?

vp_arth
  • 14,461
  • 4
  • 37
  • 66

3 Answers3

2

Just some variations:

// #1
async.map(keys, function(key, next) {
  someFoo(key, function(err, value) {
    // TODO: handle err, or not.
    next(null, value);
  });
}, function(err, result) {
  var finalresult = {};
  keys.forEach(function(key, i) {
    finalresult[key] = result[i];
  });
  cb(err, finalresult);
});

// #2
async.parallel((function() {
  var actions = {};
  keys.forEach(function(key) {
    actions[key] = function(next) {
      someFoo(key, function(err, value) {
        // TODO: handle err, or not.
        next(null, value);
      });
    };
  });
  return actions;
})(), function(err, results) {
  cb(err, finalresult);
});
robertklep
  • 198,204
  • 35
  • 394
  • 381
0

I found some solution:

var result = {}
async.each(keys, function(key, next){
  someFoo(key, function(err, value){
    if(err) 'ignore error';
    result[key] = value;
    next();
  })
}, function(err){
 cb(err, result)
})

Have anyone more beauty solution?

I think about there is not universal solution, because even here all crashes if keys includes noscalar values.

vp_arth
  • 14,461
  • 4
  • 37
  • 66
0

A little more elegant using reduce

async.reduce([1, 2, 3], {}, function(memo, item, callback) {
  memo[item] = item + item;
  cb(err, memo);
}, function(err, result) {
  cb(err, result)
});

*Untested code

Cyril CHAPON
  • 3,556
  • 4
  • 22
  • 40