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