我正在使用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)
}
显然这不是真正的代码,我只是更改了名称和对象。
感谢您提前提供任何帮助。
答案 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
内是期望值。