試圖讓我的頭在node.js上下文(異步調用)中關閉。
我有以下代碼:
timer = setInterval(pollOID, 1000);
function pollOID() {
for (channel in channels) {
session.get({ oid: channels[channel].oid }, function (varbinds) {
console.log("The " + channels[channel].name + " is " + varbinds);
});
}
}
代碼投票第二使用中的setInterval回調一個循環來查詢幾個SNMP實體路由器的每個數據SNMP路由器。 session.get函數有一個異步回調來處理來自路由器的結果。
SNMP位工作正常,我的問題是關於如何在會話異步回調內持續循環變量通道的值。
我得到如下結果:
The Download Attenuation is 7.5
The Download Attenuation is 361600
The Download Attenuation is 60
所以循環變量通道正在改變每次調用session.get作爲函數返回從路由器正確的值。我的問題是,channels [channel] .name使用通道的當前值,在回調返回時,通道已經結束並且通道爲2(第三個循環,即名稱字符串「download attenuation」)。所以我需要在session.get回調中保留通道的值,以便在回調被調用時的值,以便在session.get回調中使用正確的通道[channel] .name。
我知道我必須使用閉包,但嘗試了很多不同的方法後,我無法正常工作。任何線索指向正確的方向?謝謝!
謝謝PSL。關閉的第一個建議不起作用,因爲「渠道」沒有與原來的值保持一致,但第二個建議與綁定沒有關係。我不確定爲什麼第一個建議不起作用,正如我想的那樣,以及從我應該關閉的(有限)理解中得出的。 – deandob
@deandob本應該工作,請嘗試這種方式。 http://jsfiddle.net/pRLVC/您可以在您的代碼中使用相同的概念。 – PSL
我發現在循環塊內部聲明一個局部變量並且在閉包體中使用它''var currentChannel = channel;',然後在閉包中使用currentChannel就不那麼容易混淆了。但是現在JS中'(函數(a){/*...*/})(a);'模式非常普遍,值得習慣。 –