3

我找不到以下 async.js 库的方法:

我有:

  • 键数组['a', 'b', 'c']
  • 迭代器如:
    功能它(项目,下一个){
      下一个(空,项目+项目);
    }

如果我使用async.map([1, 5], it, cb),我会得到[2, 10]

{ 1: 2, 5: 10 }在这种情况下我该怎么办?

4

3 回答 3

2

只是一些变化:

// #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);
});
于 2013-10-08T08:40:03.047 回答
0

我找到了一些解决方案:

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

有没有更多的美容解决方案?

我认为没有通用的解决方案,因为即使在这里,如果键包含无标量值,所有崩溃。

于 2013-10-08T06:07:11.677 回答
0

使用reduce更优雅一点

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

*未经测试的代码

于 2016-10-20T11:28:03.663 回答