2012-05-27 31 views
0

可能重複:
How to pass values to a callback function at the time of the request call?如何將遞增的for-loop變量傳遞給node.js中的函數?

我知道這是一個普遍的問題,而不是隻在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); 
    }); 
    }; 
} 
+1

什麼問題? – Ashe

回答

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

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

Y ......看看那個瘋狂。無論如何,這部分:

(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 

勝利?

+0

b ...或者,「我不是」說......: – busticated