节点红色setInterval导致重新部署时出现过时的读数

时间:2016-10-07 15:41:01

标签: setinterval node-red

我正在修补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);
}

...但是现在当重新部署流程时,它会完全停止!!

1 个答案:

答案 0 :(得分:1)

每次创建节点时都会创建一个计时器,但在节点“关闭”时,您不会清除计时器。这就是为什么每次部署节点时都会触发多个计时器的原因。

您需要为close事件添加处理程序,并整理节点正在使用或创建的任何资源 - 例如计时器。

http://nodered.org/docs/creating-nodes/node-js#closing-the-node