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

NodeJS async library parallel method strange behavior

本文关键字:方法 异步 并行 NodeJS      更新时间:2023-09-26

我第一次尝试将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
  });
});