2013-10-08 26 views
3

我無法找到async.js庫的方法如下:Nodejs async:如何將鍵映射到鍵值?

我:

  • 按鍵陣列['a', 'b', 'c']
  • 迭代器,如:
 
    function it(item, next){ 
     next(null, item+item); 
    } 

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

在這種情況下,我該如何獲得{ 1: 2, 5: 10 }

回答

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

有任何人更美的解決方案?

我想沒有通用的解決方案,因爲即使在這裏所有的崩潰,如果鍵包括noscalar值。

0
使用 reduce

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

* 未經測試的代碼

多一點優雅