如何将递增的 for 循环变量传递给 node.js 中的函数

How can I pass an incrementing for-loop variable to a function in node.js?

本文关键字:node 函数 js 循环 for 变量      更新时间:2023-09-26

可能的重复项:
如何在请求调用时将值传递给回调函数?

我知道这是一个普遍的问题,不仅在节点.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);
    });
  };
}
也许

是闭包?

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

胜利?

您需要为循环的每次迭代创建一个新的变量范围。

执行此操作的唯一方法是调用函数。

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