0

重複の可能性:
リクエスト呼び出し時にコールバック関数に値を渡す方法は?

これは一般的な問題であり、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);
    });
  };
}
4

2 に答える 2

3

おそらく閉鎖

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

Yikes...その狂気を見てください。とにかく、この部分:

(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

勝利?

于 2012-05-28T00:07:35.050 に答える
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);
        });
    };
}
于 2012-05-27T23:57:07.257 に答える