0

我正在将 NodeRed 与 Home Assistant 一起使用。我有一个 webhook,我可以从物理设备发送它,触发节点红色的功能节点。函数节点如下所示:

var i = 1;

var myTimer = setInterval(function setSlackStatus(){
    if (i < 14){
        var minutesLeft = totalMinutes - [i];

        msg.payload = {
            "profile": {
                "status_text": "Back in " + minutesLeft + " minutes",
                "status_emoji": ":coffee:",
                "status_expiration": 0
            }
        };
        node.send(msg);

        i++;
    } else if (i == 14 ){
        var minutesLeft = totalMinutes - [i];

        msg.payload = {
            "profile": {
                "status_text": "Back in " + minutesLeft + " minute",
                "status_emoji": ":coffee:",
                "status_expiration": 0
            }
        };
        node.send(msg);

        i++;
    } else if (i == 15){
        msg.payload = {
            "profile": {
                "status_text": "I'll be back any second now",
                "status_emoji": ":coffee:",
                "status_expiration": 0
            }
        };
        node.send(msg);

        clearInterval(myTimer);
        i = 1;
    }
}, 60000)

msg.payload = {
    "profile": {
        "status_text": "Back in 15 minutes",
        "status_emoji": ":coffee:",
        "status_expiration": 0
    }
};

if (msg.clearTimer == "true") {
    msg.payload = "Clear Timer signal received.";
    clearInterval(myTimer);
} 

return [msg];

当我发送 webhook 时,这个函数基本上循环通过一个函数,每分钟更新一次我的 Slack 状态,直到我回来。

我现在正在寻找的是能够在需要时中途清除该循环的能力。所以我创建了第二个 webhook,将 msg.clearTimer 设置为“true”,然后触发同一个节点。但是,当我在调试节点中收到一条消息表明已收到 Clear Timer 信号时,该函数会继续以 1 分钟的间隔被调用,直到它运行完整个循环。

我想知道的是为什么。一旦我触发了这个循环功能,似乎没有办法取消它。任何建议将不胜感激。

4

1 回答 1

0

每条消息都是独立处理的,因此当第一条消息到达函数节点时声明和使用的任何变量在第二条消息到达时将不存在(并且myTimer无论如何您都会在函数开始时覆盖该值)

如果您需要在调用中保留一些东西,那么您需要从上下文中存储和检索它们。可以在此处找到有关如何在功能节点中使用上下文的文档。

至于手头的任务,我会使用一个设置为定期触发的注入节点,然后用一个由上下文变量控制的切换节点来控制它,而不是在函数节点中运行一个计时器。

于 2019-10-30T07:43:58.013 回答