2016-01-05 2 views
0

Я использую как _.map, так и async.map в части узла приложения, над которым я работаю. Я использую эти библиотеки вместе с некоторыми путаницами.с использованием _.map и async.map вместе

У меня есть массив массивов называется results, который выглядит примерно так:

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

Я хотел бы использовать _.map для доступа к каждому внутреннему массиву, а затем async.map сделать вызов API для каждого значения в пределах каждого из этих внутренних массивов. Затем я хотел бы использовать результаты этого вызова API, чтобы заменить каждое целое число внутри моих внутренних массивов на объект.

Итак, в конце мой массив массивов целых чисел вместо этого будет массивом массивов объектов на основе результатов вызова API.

[[{id: 1, email: '[email protected]', 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); 
    }) 
}); 
+0

где вы его регистрируете? – Mathletics

+0

@Mathletics, Добавлены журналы в код в моем исходном вопросе. – MattDionis

+0

Вы регистрируете 'user' до завершения операции async' getById', поэтому, конечно, это все же вход. – Mathletics

ответ

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 будет удобно.

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 более выразительным в этом отношении.

 Смежные вопросы

  • Нет связанных вопросов^_^