Здравствуйте!
В последнее время осуществлял немалый объём работы с таймерами в правилах 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: проверил бы экспериментально, но такой возможности, к сожалению, пока нет, да и хотелось бы получить полное разъяснение данной проблемы
Заранее большое спасибо!