2013-10-08 59 views
2


我有以下一段代碼應該實現TCP服務器的三個端口配置的三個回調函數。控制檯輸出應該報告它設置的三個通道中的哪一個,但是這不可能是因爲變量「i」的擴展在回調的運行時間完成,並因此得到i的最後一個值,即爲2.
我的問題:當回調被定義時,如何讓節點擴展我的變量「i」?

感謝您提前幫忙。回調變量的擴展node.js


var p_arr = [ 
    {src_port: 5500, src_host: "localhost", dst_port: 5501, dst_host: "localhost"}, 
    {src_port: 5502, src_host: "localhost", dst_port: 5503, dst_host: "localhost"}, 
    {src_port: 5504, src_host: "localhost", dst_port: 5505, dst_host: "localhost"}, 
]; 

for (var i in p_arr) { 
    try { 
     rcv_soc[i] = net.createServer(function (stream) { 
      if (verbose & 1) console.log("Listening on host %s, port %s...", p_arr[i].src_host, p_arr[i].src_port); 
      stream.on("data", function (data) { 
       if (verbose & 4) console.log("Received from app %d: %s", i, data); 
      }); 
     }); 

     rcv_soc[i].listen(p_arr[i].src_port, p_arr[i].src_host); 
    } 
    catch (err) { 
     console.log("No connection possible !!"); 
    } 
} 

回答

1

裹在與i作爲帕拉姆自動執行FUNC:

for (var i in p_arr) (function(i) { 
try { 
    rcv_soc[i] = net.createServer(function (stream) { 
     if (verbose & 1) console.log("Listening on host %s, port %s...", p_arr[i].src_host, p_arr[i].src_port); 
     stream.on("data", function (data) { 
      if (verbose & 4) console.log("Received from app %d: %s", i, data); 
     }); 
    }); 

    rcv_soc[i].listen(p_arr[i].src_port, p_arr[i].src_host); 
} 
catch (err) { 
    console.log("No connection possible !!"); 
} 
})(i) 
0

這是由於在Javascript作用域規則。

最簡單的解決方案是使用forEach爲陣列中的每個項目創建一個新的(功能)範圍:

p_arr.forEach(function(entry, i) { 
    // 'entry' is the same as 'p_arr[i]' 
    ... 
});