dea*_*dob 1 javascript closures asynchronous node.js
所有,
试图在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);
});
}
}
Run Code Online (Sandbox Code Playgroud)
该代码每秒使用setInterval回调中的循环轮询路由器以获取SNMP数据,以向路由器查询多个SNMP实体.session.get函数有一个异步回调来处理来自路由器的结果.
SNMP位工作正常,我的问题是如何在会话异步回调中保持循环变量通道的值.
我得到以下结果:
The Download Attenuation is 7.5
The Download Attenuation is 361600
The Download Attenuation is 60
Run Code Online (Sandbox Code Playgroud)
因此,当函数从路由器返回正确的值时,循环变量通道正在针对session.get的每次调用进行更改.我的问题是channel [channel] .name使用channel的当前值,当回调返回时,循环结束并且channel为2(第三个循环,即名称字符串"download attenuation").所以我需要将session.get回调中的channel值保持为调用回调时的值,以便在session.get回调中使用正确的channels [channel] .name.
我知道我必须使用一个闭包,但在尝试了许多不同的方法后,我无法正常工作.任何线索指向我正确的方向?谢谢!
您可以创建一个简单的闭包来保留本地副本channel.
function pollOID() {
for (channel in channels) {
(function(channel){
session.get({ oid: channels[channel].oid }, function (varbinds) {
console.log("The " + channels[channel].name + " is " + varbinds);
});
})(channel);
}
Run Code Online (Sandbox Code Playgroud)
或者您也可以使用bind传递参数,但上下文将在回调内部发生变化.
for (channel in channels) {
session.get({ oid: channels[channel].oid }, (function (channel, varbinds) {
console.log("The " + channels[channel].name + " is " + varbinds);
}).bind(this, channel));
}
Run Code Online (Sandbox Code Playgroud)
正如你猜测你的问题是由于channel在回调中访问是一个共享变量,并且在调用回调时你的for循环将会运行,而channel将保持最后key枚举的channels.
| 归档时间: |
|
| 查看次数: |
4466 次 |
| 最近记录: |