2014-04-17 83 views
0
//Server Functions 
var socketArray = []; 
var socketRcon = []; 
for (var i = 0; i < serversConfig.serversArray.length; i++) { 
    socketArray[i] = new Socket; 
    socketArray[i].setEncoding("utf8"); 
    socketArray[i].setNoDelay(); 
    socketArray[i].setTimeout(1000); 
    socketArray[i].connect(serversConfig.serversArray[i].port, serversConfig.serversArray[i].ip); 
    socketRcon[i] = serversConfig.serversArray[i].rcon; 
    socketArray[i].on("connect", function() { 
     this.write(socketRcon[i] + "\n", "utf8"); 
     console.log("CONNECTED TO THE SERVER..."); 
    }); 
    socketArray[i].on("data", function(data) { 
     console.log(data); 
    }); 
    socketArray[i].on("error", function(err) { 
     console.log("ERROR:" + err); 
    }); 

    socketArray[i].on("close", function(err) { 
     console.log("CLOSED:" + err); 
    }); 
}; 

這是我現在已經從一個配置文件連接到多臺服務器的代碼,我需要每個插座連接時,我需要密碼發到它。但'socketRcon [i]'是不確定的,爲什麼會發生這種情況,我該如何解決它?我VAR未定義裏面一個for循環

回答

2

因爲在代碼運行時,i等於serversConfig.serversArray.length,意思是socketRcon[i]未定義。

錨你的價值:

for(var i=0; i<l; i++) (function(i) { 
    // do stuff here 
})(i); 
+0

我試着用:http://pastebin.com/LBkBRY5g,但顯然循環沒有執行。 –

+0

請參閱http://jslinterrors.com/dont-make-functions-within-a-loop/,以便在循環中立即調用函數表達式(IIFE),在我看來,另一個選項更具可讀性。 – DaveParsons

1

你也可以只做到:

serversConfig.serversArray.forEach(function(srvconfig) { 
    var sock = new Socket(); 
    sock.setEncoding("utf8"); 
    sock.setNoDelay(); 
    sock.setTimeout(1000); 

    socketArray.push(sock); 
    socketRcon.push(srvconfig.rcon); 

    sock.on("connect", function() { 
    this.write(srvconfig.rcon + "\n", "utf8"); 
    console.log("CONNECTED TO THE SERVER..."); 
    }); 
    sock.on("data", function(data) { 
    console.log(data); 
    }); 
    sock.on("error", function(err) { 
    console.log("ERROR:" + err); 
    }); 
    sock.on("close", function(err) { 
    console.log("CLOSED:" + err); 
    }); 

    sock.connect(srvconfig.port, srvconfig.ip); 
});