我使用Async的Library Parallel方法错了吗?但是怎么样?

时间:2013-04-30 15:14:15

标签: javascript node.js

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

因此,在此示例中,printFunction中的控制台日志将打印

{ 'name' : 'jar jar binks' }
{ 'name' : 'jar jar binks' }

代码:

var people = [{ 'name' : 'obi wan kenobi'}, { 'name' : 'jar jar binks' }];

// Create an array of tasks to be processed.
for(var i = 0; i < people.length; i++) {
  tasks.push( function(callback) {
    setTimeout( makePrintFunction(people[i], callback), 200); 
  });
}

// Process those tasks.
async.parallel(tasks, function(err, stuff) {
  // ...do some stuff with the returned array here.
});

制作打印功能:

function makePrintFunction(people, next) {
  return validateAndTrackFlag(people, next);
}

function printFunction(people, next) {
  console.log(people);        // Always prints: { 'name' : 'jar jar binks' }
  next(null, true)
}

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

感谢您提前提供任何帮助。

2 个答案:

答案 0 :(得分:4)

这不是一个异步问题,这是一个关闭问题。

试试这个:

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

答案 1 :(得分:3)

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

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

甚至更好

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循环没有创建范围,即当函数被触发时i是最后一个索引。现在函数确实创建了范围,因此在匿名函数i内是期望值。