我第一次尝试将异步模块与NodeJS一起使用,当我尝试动态构建async.parallel函数的函数数组时,我遇到了一个问题:
methods = [];
for (key in entries) {
methods.push(function(callback) {
return callback(null, key);
});
}
return async.parallel(methods, function(err, results) {
console.log(results);
return render_views(req, res, 'view_blog_all', {
entries: entries
});
});
我一直看到的输出是:
[ 'powerful_sms_communication_for_teams',
'powerful_sms_communication_for_teams',
'powerful_sms_communication_for_teams' ]
我循环的'条目'对象肯定有三个不同的键。我缺少的东西?
ASYNC MODULE: https://github.com/caolan/async
答案 0 :(得分:3)
这是人们遇到异步逻辑的常见问题。关键是要记住,在您致电async.parallel
之前,您的回调将无法运行,此时,key
将成为循环中的最后一个键值。
解决此问题的一种方法是使用IIFE捕获新范围内的键值。
methods = [];
for (key in entries) {
(function(key){
methods.push(function(callback) {
return callback(null, key);
});
})(key);
}
您也可以将async.map
与普通数组和单个迭代器一起使用。
return async.map(
entries,
function(key, callback){
callback(null, key);
},
function(err, results) {
console.log(results);
return render_views(req, res, 'view_blog_all', {
entries: entries
});
}
);
答案 1 :(得分:2)
使用https://github.com/caolan/async#map
进行重写async.map(entries, function(entry, callback) {
//do your stuff, fully parallel and async ;)
callback(null, entry);
}, function(err, results) {
console.log(results);
return render_views(req, res, 'view_blog_all', {
entries: entries
});
});