一起使用_.map和async.map

时间:2016-01-05 20:46:19

标签: javascript node.js asynchronous underscore.js node-async

我在我正在处理的应用程序的Node部分中同时使用_.mapasync.map。在将这些库一起使用时,我遇到了一些困惑。

我有一个名为results的数组数组,如下所示:

[[1, 2, 3], [2, 4, 6], [1, 3, 5]]

我想使用_.map访问每个内部数组,然后使用async.map为每个内部数组中的每个值进行API调用。然后,我想使用此API调用的结果将内部数组中的每个整数替换为一个对象。

所以最后我的整数数组数组将是一个基于API调用结果的对象数组数组。

[[{id: 1, email: 'test@example.com', state: 'active'}], ...]

这是我现有的代码,我相信我正走在正确的道路上。我的第一个console.log给了我瞄准的对象,但第二个只返回整数:

_.map(results, function(result) {
  async.map(result, function(user, callback) {
    db.users.getById(user, function(err, userDetails) {
      if (err) {
        callback(null, null);
      } else {
        user = _.pick(userDetails, 'id', 'email', 'state');
        console.log(user);
      }
    });
    console.log(user);
  })
});

2 个答案:

答案 0 :(得分:0)

这是异步的,因此,您只能在回调中获得最终结果。

您应该将3个参数传递给async.map(array, iterator, callback)

async.map(results, userArrayHandler, function(err, yourFinalArray) {
    console.log(yourFinalArray);
});

function userArrayHandler(userArray, callback) {
    async.map(userArray, getUser, function(err, results) {
        callback(null, results);
    });
}

function getUser(userId, callback) {
    db.users.getById(userId, function(err, userDetails) {
        if (err) {
            callback(err);
        } else {
            var user = _.pick(userDetails, 'id', 'email', 'state');
            callback(null, user);
        }
    });
}

使用async.map对内部和外部数组而不是_.map都很方便。

答案 1 :(得分:0)

来自docs

_.map(results, function(result) {
  async.map(result, function(user, callback) {
    db.users.getById(user, function(err, userDetails) {
      callback(err, _.pick(userDetails, 'id', 'email', 'state'));
    });
  }, function(err, users){
    // here you will have your populated array of (arrays of) users
  })
});

但很快你会发现Promise.all在这方面更具表现力。