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

Я использую 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 раз в минуту, пока я не вернусь.

Сейчас я ищу возможность очистить этот цикл на полпути, если это необходимо. Поэтому я создал второй веб-перехватчик, который устанавливает для msg.clearTimer значение "true", а затем запускает этот же узел. Однако, хотя я получаю сообщение в узле отладки о том, что сигнал Clear Timer был получен, функция продолжает вызываться с интервалом в 1 минуту, пока не пройдет весь цикл.

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам