NodeJS异步库并行方法奇怪的行为

时间:2013-02-07 06:54:48

标签: javascript node.js scope

我第一次尝试将异步模块与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

2 个答案:

答案 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
  });
});