Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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 我使用的是异步';s库并行方法错误?但是怎么做呢?_Javascript_Node.js - Fatal编程技术网

Javascript 我使用的是异步';s库并行方法错误?但是怎么做呢?

Javascript 我使用的是异步';s库并行方法错误?但是怎么做呢?,javascript,node.js,Javascript,Node.js,我正在使用这个函数,但我遇到了一个奇怪的问题。我循环遍历一个对象数组来创建一个名为people的函数数组。人们被传递到async的并行方法中并行执行。然而,当我看一看实际上被传递到“printFunction”的参数“people”时,它是错误的。people参数始终是我的people数组中的最后一个对象 因此在本例中,控制台登录printFunction将打印 { 'name' : 'jar jar binks' } { 'name' : 'jar jar binks' } 代码: 显然这不

我正在使用这个函数,但我遇到了一个奇怪的问题。我循环遍历一个对象数组来创建一个名为people的函数数组。人们被传递到async的并行方法中并行执行。然而,当我看一看实际上被传递到“printFunction”的参数“people”时,它是错误的。people参数始终是我的people数组中的最后一个对象

因此在本例中,控制台登录printFunction将打印

{ 'name' : 'jar jar binks' }
{ 'name' : 'jar jar binks' }
代码:

显然这不是真正的代码,我只是更改了名称和对象


提前感谢您的帮助。

您正在处理经典的范围界定问题。试试这个:

for(var i = 0; i < people.length; i++) {
  (function(i) {
    tasks.push( function(callback) {
      setTimeout( makePrintFunction(people[i], callback), 200); 
    });
  })(i);
}

这是因为
for
循环不创建作用域,即当启动函数时
i
是最后一个索引。现在函数确实创建了作用域,所以在匿名函数中,
i
是期望值。

这不是异步问题,而是闭包问题

试试这个:

for(var i = 0; i < people.length; i++) {
  (function(i) {
    tasks.push( function(callback) {
      setTimeout( makePrintFunction(people[i], callback), 200); 
    });
  })(i);
}
for(var i = 0; i < people.length; i++) {
  (function (i){
    tasks.push( function(callback) {
      setTimeout( makePrintFunction(people[i], callback), 200); 
    });
  })(i)
}

或者
people.forEach(function(person){…})
.Oh dang你打败了我:)(尽管调用
forEach
的第一个参数将是数组项,而不是索引:)是的,它是如此明显,以至于我认为可能没有错误。:)因为您使用的是数组,可能比使用
async.parallel
更有意义。
var create_scope = function(i) {
  tasks.push( function(callback) {
    setTimeout( makePrintFunction(people[i], callback), 200); 
  });
};
for (var i = 0; i < people.length; i++) {
  create_scope(i);
}
people.forEach(function(person) {
  tasks.push( function(callback) {
    setTimeout( makePrintFunction(person, callback), 200); 
  });
});
for(var i = 0; i < people.length; i++) {
  (function (i){
    tasks.push( function(callback) {
      setTimeout( makePrintFunction(people[i], callback), 200); 
    });
  })(i)
}
people.forEach (function (p){
  tasks.push( function(callback) {
    setTimeout( makePrintFunction(p, callback), 200); 
  });
});