【问题标题】: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
    

    胜利?

    【讨论】:

    • 呸……或者,“我不是”说什么……:p
    【解决方案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);
            });
        };
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 2019-11-29
      • 2017-04-01
      相关资源
      最近更新 更多