我在我正在处理的应用程序的Node部分中同时使用_.map
和async.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);
})
});
答案 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在这方面更具表现力。