Переопределение правил с одинаковым именем


#1

Здравствуйте!
Я написал скрипт, в котором правило по обработке окончания таймера располагается сразу после объявления таймера. А программа туда доходит, если кнопку нажал. Получается, что это правило переопределяется несколько раз, сколько нажали - столько и определяется. Это не окажет вредного воздействия на устойчивость работы? Ничего где-нибудь не переполнится?
Я так поступил, чтобы код был более читаемым, тк. этот таймер сработать должен единожды и потом я его останавливаю.

		if (dev [self.OUTPUT] == 1 && !f_Dimming){
		
				log (logPreff + "команда диммирования? ожидание времени непрерывного удержания");
				
				if (timers[dimmPrepTimeoutName] != undefined){timers[dimmPrepTimeoutName].stop();}
				if (timers[dimmIntervalName] != undefined){timers[dimmIntervalName].stop();}
			
				startTimer(dimmPrepTimeoutName,2000);
				timers[dimmPrepTimeoutName].name = dimmPrepTimeoutName;
			

				defineRule(self.RN + "_dimmPrepTimeoutName",{ // вот это правило
					when: function(){return timers[dimmPrepTimeoutName].firing;},
					then: function(){

						log (logPreff + "начинаю диммирование");

#2

Выглядит так, что каждое вновь создаваемое правило, пусть даже и с тем же именем, будет дополнительно отъедать память под себя. И через несколько сотен нажатий движок правил аварийно завершит работу.


#3

а никак нельзя “перезаписать” правило? Вы же за простой читаемый код?) Так вот если я буду выносить обработчики в какую-то другую кучу мало будет понятно что к чему…


#4

Думаю, возможности перезаписать правило нет. Надо как-то вам другими средствами пробовать решать задачу. Простота и читаемость хороши для отладки, но если они задачу не решают…


#5

понятно. Думал, есть какой ID, который можно сбросить или с его номером “перезаписать”. Буду пробовать выносить. Спасибо!


#6

Скажите, пожалуйста, есть ли возможность из тела правила (then) возвратить имя этого правила?


#7

Или подскажите, где в документации об этом можно прочитать, я не нашел(


#8

Не знаю, никогда с таким не сталкивался.
Для какой задачи это нужно? Может быть, мы сможем посоветовать какие-то обходные пути?


#9

давайте попробуем обходные.
Я создаю в цикле несколько правил. Присваиваю этим правилам уникальные имена. Через переменную, заранее они мне не известны, они определяются установками при вызове объекта, создающего эти правила. Они инициализируются и работают. Но если я хочу в лог вынести информацию о работе этого правила, то обращаюсь к переменной, которая это правило называет. При этом имена меняются и правила называются верно, а вот при выводе в лог (при отработке правила), в переменной , она ведь ссылочная, остается последнее значение. Я решил, что раз напрямую через переменную вытащить имя не могу, было бы здорово, вытащить его из контекста уже работающего правила.


#10

Может быть вам при создании правила зашивать внутрь его переменную, в которой будет храниться его название?


#11

это как? в смысле, что значит “зашивать”?


#12

при создании правила в его текст добавлять создание переменной - константы, в которой содержится название правила


#13

так эта переменная называется одинаково. Я же написал.
Есть цикл. В этом цикле создаются однотипные правила с разным набором вх. данных. Если я внутри пишу var rule_name = preff+“ABC”, то это имя присваивается правилу, но при вызове этого правила, в этой переменной (rule_name) остается последнее из цикла значение. Переменная - ссылочный тип.


#14

Напрашивается решение сохранять эти переменные, к примеру в стеке или очереди.


#15

это возможно, я ведь определяю в правиле порядковый номер из массива входных данных, значит, могу и имя найти, это теоретически. Но все это как-то криво, костыльно. И еще не факт, что получится, на самом деле, надо пробовать…