【问题标题】:How can I pass an incrementing for-loop variable to a function in node.js? [duplicate]如何将递增的 for 循环变量传递给 node.js 中的函数? [复制]
【发布时间】:2012-05-27 23:29:02
【问题描述】:
可能重复:
How to pass values to a callback function at the time of the request call?
我知道这是一个普遍的问题,不仅在 node.js 中。我必须将一个变量从 for 循环传递给我想要生成的函数。这些函数存储在一个数组中,并且必须记住这些变量。
这是我的例子:
for(var i = 0; i < administratorIds.length; i ++){
adminCallbacks[adminCallbacks.length] = function(callback){
model_user.getById(administratorIds[i], function(user){
administrators[administrators.length] = {name: user.getName()};
callback(null, null);
});
};
}
【问题讨论】:
标签:
javascript
node.js
for-loop
【解决方案1】:
也许是closure?
for(var i = 0; i < administratorIds.length; i ++){
adminCallbacks.push(
(function(i){
return function(callback){
model_user.getById(
administratorIds[i],
function(user){
administrators[administrators.length] = {name: user.getName()};
callback(null, null);
}
);
};
})(i)
);
}
哎呀...看看那个疯狂。无论如何,这部分:
(function(i){
// stuff!
})(i);
在闭包中捕获 i 的当前值,从而确保在触发回调后它不会改变。
一个例子:
var i = 10;
var lockedI = (function(i){
return function(){ console.log('i is --> ' + i); };
})(i);
var unlockedI = function(){ console.log('i is --> ' + i); };
lockedI();
// i is --> 10
unlockedI();
// i is --> 10
var i = 666;
lockedI();
// i is --> 10;
unlockedI();
// i is --> 666
胜利?
【解决方案2】:
您需要为循环的每次迭代创建一个新的变量范围。
唯一的方法是调用一个函数。
for(var i = 0; i < administratorIds.length; i++){
adminCallbacks[adminCallbacks.length] = createHandler(i); // pass i
}
// receive i as j-----v
function createHandler(j) {
// return a function...
return function(callback){
// ...that uses j-----------------v
model_user.getById(administratorIds[j], function(user){
administrators[administrators.length] = {name: user.getName()};
callback(null, null);
});
};
}