Используйте clearInterval в NodeRed - PullRequest
       37

Используйте clearInterval в NodeRed

0 голосов
/ 30 октября 2019

Я использую NodeRed с Home Assistant. У меня есть веб-крючок, который я могу отправить с физического устройства, которое вызывает функциональный узел красного цвета. Узел функции выглядит следующим образом:

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];

Когда я отправляю веб-крючок, эта функция в основном перебирает функцию, которая обновляет мой статус Slack раз в минуту, пока я не вернусь.

What I 'Сейчас я ищу возможность очистить этот цикл на полпути, если это необходимо. Поэтому я создал второй webhook, который устанавливает msg.clearTimer в значение «true», а затем запускает этот же узел. Однако, хотя в отладочном узле я получаю сообщение о том, что был получен сигнал сброса таймера, функция продолжает вызываться с интервалом в 1 минуту, пока она не пройдет весь цикл.

То, что я хочу знать, это почему. После запуска этой функции зацикливания кажется, что отменить ее невозможно. Любой совет будет принята с благодарностью.

1 Ответ

0 голосов
/ 30 октября 2019

Каждое сообщение обрабатывается независимо, поэтому любые переменные, объявленные и используемые при поступлении первого сообщения в узел функции, не будут существовать при поступлении второго сообщения (и вы в любом случае перезаписали бы значение myTimer в начале функции)

Если вам нужно, чтобы что-то сохранялось при вызовах, вам нужно сохранить и извлечь их из контекста . Документация о том, как использовать контекст в узлах функций, может быть найдена здесь .

Что касается поставленной задачи, я бы посмотрел, используя узел инъекции, установленный для запуска регулярных интервалов, затемВорота с узлом коммутатора, управляемым контекстной переменной, вместо запуска таймера в узле функции.

...