вызов метода при изменении свойства объекта

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Sergey2055
Сообщения: 73
Зарегистрирован: Ср авг 31, 2016 7:54 am
Благодарил (а): 12 раз
Поблагодарили: 1 раз

Re: вызов метода при изменении свойства объекта

Сообщение Sergey2055 » Чт авг 17, 2017 8:12 am

Пордон но мне надо в методе на все объекты которые в этом классе, т.е. если свойство у одного из объектов меняется, то вызывается метод и меняет другое свойство этого объекта, но с задержкой по времени, если в этот интервал времени опять не попадет изменение свойства этого объекта и не произойдет опять вызов метода, то опять перезапускаем таймер.
Смысл в том, что если нужное мне свойство объекта за промежуток времени не изменится то пишем 0 в alive. Меняется за этот промежуток пишем 1. Может как по другому можно но я не в курсе.

clearTimeout("timer_live_timeout");
$this->setProperty('alive',1);

setTimeOut("timer_live_timeout", "sg('alive',0);",60);

Сильно не пинайте я не гуру в PHP, а начинающий.
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: вызов метода при изменении свойства объекта

Сообщение olehs » Чт авг 17, 2017 1:37 pm

пардон

Код: Выделить всё

setTimeout("timer_live_timeout", "sg('".$this->object_title.".alive',0);", 60); 
Sergey2055
Сообщения: 73
Зарегистрирован: Ср авг 31, 2016 7:54 am
Благодарил (а): 12 раз
Поблагодарили: 1 раз

Re: вызов метода при изменении свойства объекта

Сообщение Sergey2055 » Чт авг 17, 2017 2:37 pm

Сейчас работает но проблема в следующем допустим есть объекты а, в, с. Приходит параметр который изменяет свойство объекта а. Запускается метод в котором устанавливается alive = 1, но пока работает таймер приходит свойство объекта b и потом с. После выдержки таймера сброс происходит последнего остальные остаются alive = 1. Что то видимо я не так описал. Надо что бы после вызова метода свойством оставалась привязка таймера к такому же объекту свойство которого метод вызвало. Т.е. вызвал объект а запустился метод с таймером и при этом свойство объекта а изменилось по истечении времени независимо от других объектов и также у b и с. Как это реализовать сейчас у меня вот так:

clearTimeout("timer_live_timeout");
$this->setProperty('alive',1);
setTimeout("timer_live_timeout", "sg('".$this->object_title.".alive',0);", 60);
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: вызов метода при изменении свойства объекта

Сообщение olehs » Чт авг 17, 2017 3:28 pm

еще один вариант ;)

Код: Выделить всё

setTimeout($this->object_title."_timeout", "sg('".$this->object_title.".alive',0);", 60);
За это сообщение автора olehs поблагодарил:
Sergey2055 (Чт авг 17, 2017 3:38 pm)
Рейтинг: 1.16%
Аватара пользователя
foxvlad
Сообщения: 287
Зарегистрирован: Пн сен 22, 2014 3:18 pm
Откуда: Сочи
Благодарил (а): 78 раз
Поблагодарили: 78 раз
Контактная информация:

Re: вызов метода при изменении свойства объекта

Сообщение foxvlad » Пт сен 08, 2017 5:38 pm

Подскажите были какие то изменения, перестал отрабатывать метод при изменении свойства.
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: вызов метода при изменении свойства объекта

Сообщение olehs » Пн сен 11, 2017 8:12 pm

foxvlad писал(а):Подскажите были какие то изменения, перестал отрабатывать метод при изменении свойства.
Сегодня тоже поймал ситуацию, когда не отработал метод при изменении. В истории изменение видно. А в X-Ray вызова метода нет.
Похоже связано с введением callMethodSafe. Но это не точно :D
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: вызов метода при изменении свойства объекта

Сообщение olehs » Вт сен 12, 2017 12:58 am

Сергей, копнул я дальше и вот до чего докопался:

callMethodSafe, вызываемый при изменении свойства, использует getUrlBackground, в котором стоит таймаут запроса в 1мс.
Именно из-за такого маленького таймаута методы иногда не выполняются. Возможно, curl уходит в таймаут еще до вызова /objects (на name-resolving).
Кроме того, в режиме getUrl(background=true) прячутся все ошибки, т.е. если в метод закралась пользовательская ошибка, он о ней нигде не узнает.

Я думаю, нужно во всех *Safe - методах, как и раньше, использовать getUrl вместо getUrlBackground.
Да и обработчки ONCHANGE, по-моему, лучше вообще вызывать напрямую.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: вызов метода при изменении свойства объекта

Сообщение sergejey » Вт сен 12, 2017 10:24 am

olehs писал(а):Сергей, копнул я дальше и вот до чего докопался:

callMethodSafe, вызываемый при изменении свойства, использует getUrlBackground, в котором стоит таймаут запроса в 1мс.
Именно из-за такого маленького таймаута методы иногда не выполняются. Возможно, curl уходит в таймаут еще до вызова /objects (на name-resolving).
Кроме того, в режиме getUrl(background=true) прячутся все ошибки, т.е. если в метод закралась пользовательская ошибка, он о ней нигде не узнает.

Я думаю, нужно во всех *Safe - методах, как и раньше, использовать getUrl вместо getUrlBackground.
Да и обработчки ONCHANGE, по-моему, лучше вообще вызывать напрямую.
Прямой вызов плох тем, что если он "падает" из-за некорректности кода пользователя (что очень часто бывает), то "падает" и вся цепочка, в которой могут и более важные вещи выполняться, нежели конкретный ошибочный код. Насчёт того, что у curl-а срабатывает таймаут ещё до http-запроса -- такое пожалуй возможно, я как-то об этом не подумал. В общем, проблему отметил себе, постараюсь в ближайшее время подобрать решение.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: вызов метода при изменении свойства объекта

Сообщение olehs » Вт сен 12, 2017 10:40 am

sergejey писал(а):Прямой вызов плох тем, что если он "падает" из-за некорректности кода пользователя (что очень часто бывает), то "падает" и вся цепочка, в которой могут и более важные вещи выполняться, нежели конкретный ошибочный код. Насчёт того, что у curl-а срабатывает таймаут ещё до http-запроса -- такое пожалуй возможно, я как-то об этом не подумал. В общем, проблему отметил себе, постараюсь в ближайшее время подобрать решение.
Так а разве там нет обычного try/catch, чтобы не падало с концами?
В любом случае, желательно не скрывать эти ошибки.
London
Сообщения: 76
Зарегистрирован: Чт фев 07, 2019 12:17 pm
Благодарил (а): 14 раз
Поблагодарили: 45 раз

Re: вызов метода при изменении свойства объекта

Сообщение London » Вт фев 12, 2019 2:20 pm

Сравнил поведение на demo версии с официального сайта и на том, что установлено у меня, при sg('HomeBridge.from_set',1); на демо версии всё отрабатывает, а у меня ничего не происходит.. даже если оставить там просто DebMes('test');
в какую сторону копать с тем, что не работает вызов метода при изменении свойства объекта?
Ответить