Javascript NodeJS异步库并行方法奇怪的行为
我第一次尝试在NodeJS中使用async模块,当我尝试动态构造一个函数数组以运行async.parallel函数时遇到了一个问题:Javascript NodeJS异步库并行方法奇怪的行为,javascript,node.js,scope,Javascript,Node.js,Scope,我第一次尝试在NodeJS中使用async模块,当我尝试动态构造一个函数数组以运行async.parallel函数时遇到了一个问题: methods = []; for (key in entries) { methods.push(function(callback) { return callback(null, key); }); } return async.parallel(methods, function(er
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' ]
我循环的“entries”对象肯定有三个不同的键。我错过了什么
异步模块:
这是人们在使用异步逻辑时遇到的一个常见问题。关键是要记住,只有调用
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
});
}
);
这是人们在使用异步逻辑时遇到的一个常见问题。关键是要记住,只有调用
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
});
}
);
这里有一个使用
这里有一个使用
啊,我明白了,好吧,我正在努力找出适应这种情况的最佳方式。非常感谢,这非常有帮助!我还建议您查看
async.map()
docs,因为您似乎在每个数组元素上执行相同的函数。我想,我的示例过于简单了。我正在为对象中的每个键执行一个异步方法,我希望它们都能运行parallel@CaseyFlynn尝试一下这个映射,您会注意到它也是并行的,并为您提供了一个回调来执行异步操作。它只是消除了你为创建函数而编写的循环。啊,我明白了,好吧,我正试图找出适应它的最佳方式。非常感谢,这非常有用!我还建议您查看async.map()
docs,因为您似乎在每个数组元素上执行相同的函数。我想,我的示例过于简单了。我正在为对象中的每个键执行一个异步方法,我希望它们都能运行parallel@CaseyFlynn尝试一下这个映射,您会注意到它也是并行的,并为您提供了一个回调来执行异步操作。它只是消除了为创建函数而编写的循环。