NodeJS异步库并行方法的奇怪行为
NodeJS async library parallel method strange behavior
我第一次尝试将async模块与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' ]
我正在循环的"entries"对象肯定有三个不同的键。我错过了什么?
异步模块:https://github.com/caolan/async
这是人们在使用异步逻辑时遇到的常见问题。关键是要记住,在调用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
});
}
);
以下是使用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
});
});
相关文章:
- 将其中一个异步方法重写为使用promise的方法
- 异步处理所有事件处理程序的方法
- strongloop script.js run find in before delete方法:如何同步运行异步方法
- QtWebKit中的JavaScript和异步方法
- jQuery-有没有一种方法可以测试函数是否异步
- Node.js-异步方法调用问题
- Ember.js-模型find()方法中的异步调用
- 使用异步模块的Express + Mongoose请求处理程序的更简洁的方法
- 与 promise 一起使用时,异步瀑布不执行下一个回调方法
- Meteor:如何遍历一个数组,这是一个异步方法的结果
- 任何控制Javascript异步加载顺序的方法
- 并行开发同步/阻塞和异步/非阻塞库api的好方法是什么?(JavaScript)
- JavaScript中异步方法的优点是什么
- 如何将异步方法返回的值发送到javascript中的另一个异步方法
- 在执行另一个异步函数之前,只有当条件为true时,才执行某些异步函数的最佳方法
- 处理角控制器中异步更新的正确方法
- 使用异步代码引发/捕获错误的替代方法
- 更正Node.js异步管道中的对象方法调用
- 如何从控制器中多次调用方法?异步传输
- 使用Rhino从Java方法异步调用JavaScript回调