gpt4 book ai didi

javascript - 闭包和异步 node.js 函数

转载 作者:行者123 更新时间:2023-11-30 08:04:26 25 4
gpt4 key购买 nike

全部,

试图了解 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 位工作正常,我的问题是关于如何在 session 异步回调中保留循环变量 channel 的值。

我得到以下结果:

The Download Attenuation is 7.5
The Download Attenuation is 361600
The Download Attenuation is 60

因此循环变量 channel 在每次调用 session.get 时都会发生变化,因为该函数从路由器返回正确的值。我的问题是 channels[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);
}

或者你也可以使用 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));
}

正如您所猜测的那样,您的问题是由于在回调中访问 channel 造成的,这是一个共享变量,当回调被调用时,您的 for 循环将运行完毕并且 channel 将持有从 channels 枚举的最后一个 key

关于javascript - 闭包和异步 node.js 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20505082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com