Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS异步库并行方法奇怪的行为_Javascript_Node.js_Scope - Fatal编程技术网

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

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

我第一次尝试在NodeJS中使用async模块,当我尝试动态构造一个函数数组以运行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”对象肯定有三个不同的键。我错过了什么

异步模块:
这是人们在使用异步逻辑时遇到的一个常见问题。关键是要记住,只有调用
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尝试一下这个映射,您会注意到它也是并行的,并为您提供了一个回调来执行异步操作。它只是消除了为创建函数而编写的循环。