Здравствуйте!
В последнее время осуществлял немалый объём работы с таймерами в правилах WB и документация немного запутала в том, как на самом деле работают таймеры.
Приведу пример, в чем возникла проблема:
Писал правило, которое при срабатывании условия по прошествии 5 секунд переводило бы переменную в true. Тип правила - asSoonAs
, и, если условие становится ложным, таймер должен останавливаться при помощи метода stop()
(если таймер активен, конечно же)
Также привожу примерный код:
defineRule("rule1", {
asSoonAs: function() {
var condition = dev["dev1/dep"];
// Если условие ложно и переменная "горит"
if ( !condition && dev["dev1/ch1"] ) {
dev["dev1/ch1"] = false;
}
// Если условие ложно, остановить таймер
if ( !condition ) {
timers.timer.stop();
}
return condition;
},
then: function() {
startTimer("timer", 5000);
}
});
Также правило по срабатыванию таймера:
defineRule("rule1_handler", {
asSoonAs: function() {
return timers.timer.firing;
},
then: function() {
dev["dev1/ch1"] = true;
}
});
Проблема возникла следующая: таймер срабатывал в самые непредсказуемые моменты, т.е тогда, когда condition
явно не горел 5 секунд.
Через некоторое время возникла теория, что метод stop()
приостанавливает таймер, но не останавливает его полностью. Т.е следующий раз, когда таймер запущен, он возобновляется. Правда ли это?
Следовательно, как лучше поступить в этой ситуации, если нужно, чтобы таймер полностью сбрасывался?
Видел функцию clearTimeout()
, ее можно применить к startTimer()
? И будет она работать по другому (в сравнение с методом stop()
)? Возвращает ли startTimer()
идентификатор таймера?
И в целом по коду: хорошая ли практика проверять условие остановки таймера и соответственно останавливать его в asSoonAs
части правила или лучше реализовать по другому?
P.S: проверил бы экспериментально, но такой возможности, к сожалению, пока нет, да и хотелось бы получить полное разъяснение данной проблемы
Заранее большое спасибо!