0

我第一次尝试将 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' ]

我循环的“条目”对象肯定有三个不同的键。我错过了什么?

异步模块: https ://github.com/caolan/async

4

2 回答 2

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
    });
  }
);
于 2013-02-07T06:59:57.733 回答
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
  });
});
于 2013-02-07T07:08:41.983 回答