"OFF" 负载上的 clearInterval

clearInterval on "OFF" payload

我在使用特定负载实施 clearInterval 时遇到新手困难。

if(msg.payload.state === "OFF")

有效,但计时器不会停止。

在众多资源中,我看过how to stop setInterval in JS in node-red..?, , clearInterval doesn't clearInterval & clearInterval On Image Slider Plugin

我确实有一个类似的函数,"dominos",我用它来确保我正在解析 "OFF" 有效负载。 我已经包含了很多注释代码来展示我的尝试。抱歉弄得一团糟!

我的语法有问题吗?

代码是否合乎逻辑?

var input = msg.payload.state;
let timer = 0;

var red = {"state":"ON","brightness":255,"color":{"r":255,"g":0,"b":0}};
var green = {"state":"ON","brightness":255,"color":{"r":0,"g":255,"b":0}};


function xmas() {    // REPEATS!
    node.send({payload:red});
    setTimeout(function(){
        node.send({payload:green});
    }, 1500);
}
// repeat with 3 second interval
timer = setInterval(() => xmas(), 3000);
if (msg.payload.state === "OFF") {
    timer = clearInterval();
}

关于功能节点要记住的重要一点是,它的状态会针对每条传入消息完全重置。这意味着计时器将始终由 let timer = 0;

重置为零

如果你想在消息之间存储任何状态,那么你需要使用 context

另外,您使用 clearInterval() 的方式永远行不通,您需要将计时器对象的引用传递给此函数,以便它执行任何有用的操作。

以下功能节点应该符合我的预期。

var red = {"state":"ON","brightness":255,"color":{"r":255,"g":0,"b":0}};
var green = {"state":"ON","brightness":255,"color":{"r":0,"g":255,"b":0}};


if (msg.payload.state != "OFF") {
   var timer = setInteval(()=>{
      node.send({payload: red});
      setTimeout(() => {
           node.send({payload: green});
      }, 1500);
   }, 3000);
   context.set("timer",timer);
} else {
   var timer = context.get("timer");
   clearInterval(timer);
}