我正在使用 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/