我正在修补Node-Red并制作了我的第一个简单自定义节点,每次收到输入时都会添加到计数器中。
该节点还包含对setInterval
的调用,该调用会在node.send()
中使用计数器值调用msg.payload
后5秒钟。
module.exports = function(RED) {
function MyNode(config) {
RED.nodes.createNode(this, config);
var node = this;
var count = 0;
this.on('input', function(msg) {
count++;
});
setInterval(function() {
var msg =
{
payload: { countTotal : count }
};
node.send(msg);
return;
}, 5000); // 5 Second Timer
}
RED.nodes.registerType("my-node", MyNode);
}
如果我部署流,则节点的行为符合预期。但是,如果我重新部署流程,我似乎从node.send()接收两个调用。
一个是正确的值,另一个是重新部署之前的最新/陈旧值。
例如:
在5秒之前部署并点击输入6次
05秒:countTotal = 6
10秒:countTotal = 6
15秒:countTotal = 6
重新展开并在5秒前点击输入3次
05秒:countTotal = 3
05秒:countTotal = 6 [旧陈旧阅读]
如果我重新启动节点红色,那么它开始按照我的预期行事。
我的问题
这是在节点内设置计时器的正确方法,如果不是我应该做什么?如果是,为什么过时的数据会通过?
非常感谢。
更新
关闭了knolleary的答案,我尝试了以下更改
module.exports = function(RED) {
function MyNode(config) {
RED.nodes.createNode(this, config);
var node = this;
var count = 0;
var timer = setInterval(function() {
var msg = { payload: { countTotal : count }};
node.send(msg);
return;
}, 5000); // 5 Second Timer
this.on('input', function(msg) {
count++;
});
this.on('close', function(msg) {
clearTimeout(timer);
});
}
RED.nodes.registerType("my-node", MyNode);
}
...但是现在当重新部署流程时,它会完全停止!!
答案 0 :(得分:1)
每次创建节点时都会创建一个计时器,但在节点“关闭”时,您不会清除计时器。这就是为什么每次部署节点时都会触发多个计时器的原因。
您需要为close
事件添加处理程序,并整理节点正在使用或创建的任何资源 - 例如计时器。
http://nodered.org/docs/creating-nodes/node-js#closing-the-node