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

标签 javascript node.js

我正在使用 async library's parallel功能,但我遇到了一个奇怪的问题。我循环遍历一组对象以创建一组称为 people 的函数。人们被传递到异步的并行方法中以并行执行。但是,当我查看实际传递给“printFunction”的参数“people”时,它是错误的。 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)
}

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

提前感谢您的帮助。

最佳答案

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

试试这个:

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

关于javascript - 我使用 Async 的 Library Parallel 方法错了吗?但是怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16303278/

相关文章:

javascript - 在 node-cron 中获取下一个 cron 作业时间

node.js - Fs-Extra 可以只删除目录下的文件吗?

javascript - NestJS/TypeORM : Cannot set property metadata of#<Repository> which has only a getter

javascript - Chrome 和 Safari 使用 socket.io 恢复为 xhr-polling 而不是 websockets

javascript - 我怎样才能滚动到并可能突出显示 div 中的文本溢出 : true?

javascript - 为什么我的数组中的项目不显示在单独的行中?

javascript - onclick 在弹出框中显示图像

javascript - ngView 中的模板调用不支持 Angular Directive(指令) stackoverflow

html - 使用 NodeJS Express 时将表单数据插入 MySQL 数据库

javascript - 如何使用 jquery 修改 iframe 标签中的 url 协议(protocol)