Логика работы скриптов


#21

тут только одна проблемка, контроллер у меня один и на нем отопление дома, а эксперименты с кодом зачастую приводят к ошибкам которые могу стопорнуть систему. :frowning:


#22

вопрос по объектам объявленным вне кода, они состоят из данных и функций, как они видятся? сохраняются ли данные объекта как глобальные, то есть до перезапуска движка? И как работают функции объекта (методы), при каждом вызове их внутреннее пространство создается заново, а данные объекта одни для всех одновременно вызванных функций?


#23

Ну, в общем и целом, вы все правильно понимаете, но тема достаточно сложная, чтобы ее в рамках форума подробно расписывать. Я вот нашел на Хабре неплохую статью к вашим вопросам, посмотрите, пожалуйста: Особенности работы или «За что я люблю JavaScript»: Замыкания, Прототипирование и Контекст, думаю, многое прояснится. Не спешите со сложными конструкциями в коде правил, многое можно делать достаточно просто.


#24

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


#25

Да, как я выше писал, движок – это Duktape, в плане языка можете ориентироваться на него.


#26

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

	var swichControlGROUP1 = function (ruleName,
	...
	{//конструктор первичные установки
	this.RN = ruleName;
	if (this.RN == undefined) {this.RN = "swichControlGROUP1"};

	this.IDN = inputDevName;
	this.ICN = inputCellName;
	...
	var IDN = this.IDN;
	...

и метод - запуск правила:

	this.defineRule = function ()
	{
defineRule(this.RN, 
{
  	whenChanged: this.IDN + "/" + this.ICN,
	then: function (newValue,devName,cellName)
	{
		log (" start rule this.IDN   this.ICN :" + IDN + "/" + swichControlGROUP1.ICN );
                    log (" start rule this.IDN   this.ICN :" + this.IDN + "/" + this.ICN );
      if (newValue == 0)
...

вот тут я поплыл. Если в whenChanged: this.IDN + “/” + this.ICN, верно интерпретируются имена входов (скрипт отрабатывает), то после then все, мой this куда-то улетает и я вижу undefined в переменных во всех вариантах какие я придумал

2019-02-28 01:50:13 start rule this.IDN this.ICN :undefined/undefined
2019-02-28 01:50:13 start rule this.IDN this.ICN :undefined/undefined

вызываю так, все инициализирую:

	var SW1 = new swichControlGROUP1();
	SW1.RN = "sw1_rule";
	SW1.IDN = "wb-gpio";
	SW1.ICN = "EXT1_DR1";
	SW1.ODN = "wb-mr6c_13";
	SW1.OCN = "K1";
	SW1.DDN = "wb-dac";
	SW1.DCM = "EXT_O1";
	SW1.SDL = 5000;

	log ("SW1.IDN   SW1.ICN :" + SW1.IDN + "/" + SW1.ICN );  Этот лог все корректно показывает.

	SW1.defineRule();

Уверен, мне просто не хватает знаний в JS, помогите, пожалуйста.


#27

polygon, добрый день!
На первый взгляд мне кажется, что проблема связана с тем, что контекст вызова (this) у вас изменяется внутри анонимной функции

function (newValue,devName,cellName)

Нужные вам значения внутри её должны передаваться через devName и cellName


#28

добрый! Да, я тоже так думаю, но как я понимаю, эти свойства нативные, и они передаются вашей системой автоматически и я могу их использовать в функции. Что туда записать что-то иное - я не знаю, а можно? Можно ли туда свои свойства добавить? Я попробую…
Мне советовали уже отходить от ООП, не париться, но тут я не вижу запарки, мне кажется, я верно делаю, ведь думать о разных переменных, пересечениях и т.д. в век, когда космические корабли бороздят просторы вселенной)) Мне кажется, вы создали классный продукт, и мне очень хочется в меру сил использовать его возможности.
Я переделал свой скрипт, который вам присылал в парадигме ООП, учел там некоторые конструкции таймеров, которые прочитал в документации по движку, но не могу проверить работу, у меня просто до таймеров дело не доходит, т.к. проблема с этой областью видимости) А параметры, которые мне придется передавать, их не только имя и значение. Там и сущности, на которые оказывается воздействие, их то куда приставить? Очень надеюсь на вашу помощь или не помощь сообщества в этом вопросе. Если вы не против, я закину вам скрипт полностью, который тут указан, может вам будет проще разобраться, если вы, конечно, посчитаете это возможным.


#29

Сохраните this уровня defineRule в отдельное поле, тогда он будет доступен из then-функции.

this.defineRule = function () {
   var self = this;
....
   then: function (newValue,devName,cellName) {
      log (self.IDN);
   }
}

#30

Большое вам спасибо! У меня заработало после вашего совета. Логика в том, чтобы вовнутрь перенести ссылку, а дальше все, что внутри этой функции, получается, уже видит её. Если, конечно, я правильно понял.