|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: May 2016
Сообщений: 25
|
Цитата:
mc.addEventListener("asdf",handler1,false,int.MIN_VALUE); mc.addEventListener("asdf",handler2,false,int.MIN_VALUE); mc.addEventListener("qwer",handler3); mc.addEventListener("qwer",handler4); mc.dispatchEvent(new Event("asdf")); function handler1(e:Event):void { trace("handler 1"); mc.dispatchEvent(new Event("qwer")); } function handler2(e:Event):void { trace("handler 2"); } function handler3(e:Event):void { trace("handler 3"); } function handler4(e:Event):void { trace("handler 4"); } //output: // handler 1 // handler 3 // handler 4 // handler 2 |
|
|||||
Это абсолютно нормальное поведение (Стек вызова). Слушатели в диспетчере вызываются не одновременно, а по очереди. Пока весь нижележащий стек слушателя не будет выполнен, управление не возвращается в диспетчер для вызова следующего слушателя. Если вам нужно выполнить обновление после всех слушателей, используйте отложенный вызов setTimout. (Как вариант)
__________________
Дети не должны знать о своих родителях |
|
|||||
Lorem ipsum
|
А вот AS3 не берет на себя ни мороку, ни право решать, нужно ли все же "деду" помимо всего еще и "added" получать. Ведь взрослый бородатый кодер сам может прервать дальнейшую обработку любого события, если сочтет необходимым.
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Apr 2018
Сообщений: 42
|
Цитата:
|
|
|||||
Регистрация: May 2016
Сообщений: 25
|
Цитата:
"Может он имел ввиду, что события вкладываются один в другого, да и в теме написано? Да не, он действительно думает, что объекты отбиваются от орд случайно генерируемых FP 'по фану' событий" Цитата:
Разумеется, в тех вариантах свои изъяны. Но это не отменяет того факта, что изъяны существуют. Конечно, до тебя ни разу в жизни не слышал ни про однопоточность, ни про стек вызовов. Но ты - добрая душа, и не позволил мне жить во тьме мракобесия. |
|
|||||
Регистрация: Apr 2018
Сообщений: 42
|
robotR2D2, Ну ты же сам написал, что события распространяются "абы как". А сейчас пишешь, что они распространяются так, как попадают в стек. Это же не "абы как". Мне самому во многом не нравится флешевская событийная модель. Преимущественно из-за строковых типов событий и также по той причине, что ты здесь описал. Но это не изъян, просто это сделано так, как сделано. Всем не угодишь. Вот то, что в OpenFl, который ты привел, события будут вызываться по разному в зависимости от таргета - вот это изъян. А во флеше все предсказуемо и логично. То, что оно работает не так, как тебе надо, не значит, что оно работает плохо.
По существу могу сказать, что в свое время я реализовывал фичу с упорядоченным распространением событий через очередь. Ничего более толкового придумать тогда не смог, да и работает вроде бы не плохо. Код на Haxe: public function dispatch(event:EVENT) { if (_isDispatching) { _queue.push(event); } else { _isDispatching = true; while (event != null) { var next = _head; while (next != null) { var listener = next.listener; next = next.next; if(listener.enabled) { switch (listener.comparisonMethod) { case ListenerFlags : if ((event.bitmask & listener.bitmask) == listener.bitmask) listener.handler(event); case EventFlags : if ((event.bitmask & listener.bitmask) == event.bitmask) listener.handler(event); case AnyFlags : if ((event.bitmask & listener.bitmask) > 0) listener.handler(event); } } if (listener.isDestroyed) removeListener(listener); } event = _queue.shift(); } _isDispatching = false; } } public function dispatchChain(chain:Array<EVENT>) { for (event in chain) _queue.push(event); if (!_isDispatching) dispatch(_queue.shift()); } |
|
|||||
Регистрация: May 2016
Сообщений: 25
|
Помимо "абы как" я еще привел ряд примеров, конкретизирующих это "абы как". Например, случай, когда дед узнает о существовании правнука, а уже потом о внуке. И подобное я считаю изъяном. Даже с учетом того, что система программировалась с пониманием подобного недостатка.
Ранее я уже акцентировал, что мне интересно улучшение существующего алгоритма, я не ставлю задачу втоптать его в грязь. Приведенный пример - это как раз вариант реализации предложения №2 из первого поста. И он таки тоже имеет изъян... Идея в принципе, а не конкретно твоя реализация. Тот кто запускает dispatch - не может быть уверен, что событие распространилось в теле метода-вызова, а это может быть местами критично. Я в целом склоняюсь к реализации и классических событий, и вот таких - отложенных. |
|
|||||
Регистрация: Apr 2018
Сообщений: 42
|
Цитата:
|
|
|||||
Регистрация: May 2016
Сообщений: 25
|
Тут дело не в последовательности доставки событий. Это как раз решено. Проблема в том, что неизвестно, когда именно событие будет доставлено. Пример (если я понял твою реализацию правильно):
var dispatcherFirst:YourCustomDispatcher = new YourCustomDispatcher(); dispatcherFirst.adEventListener("first", onFirst1); dispatcherFirst.adEventListener("first", onFirst2); var dispatcherSecond:YourCustomDispatcher = new YourCustomDispatcher(); dispatcherFirst.adEventListener("second", onSecond); var x:int = 0; dispatcherFirst.dispatch(new Event("first")); function onFirst1(e:Event):void { dispatcherSecond.dispatch(new Event("second")); trace(x); // Output: 0 Expected: 5 } function onFirst2(e:Event):void { // any } function onSecond(e:Event):void { x = 5; } |
|
|||||
Не понял прикола. Почему не известно, когда событие будет доставлено, если оно будет доставлено тогда, когда к нему подберется стек? И в данном случае
var dispatcherFirst:EventDispatcher = new EventDispatcher(); dispatcherFirst.addEventListener("first", onFirst1); dispatcherFirst.addEventListener("first", onFirst2); var dispatcherSecond:EventDispatcher = new EventDispatcher(); dispatcherSecond.addEventListener("second", onSecond); var x:int = 0; dispatcherFirst.dispatchEvent(new Event("first")); function onFirst1(e:Event):void { trace('onFirst1'); dispatcherSecond.dispatchEvent(new Event("second")); trace(x); // Output: 0 Expected: 5 } function onFirst2(e:Event):void { trace('onFirst2'); } function onSecond(e:Event):void { trace('onSecond'); x = 5; }
__________________
while(live()) { hope(); } |
Часовой пояс GMT +4, время: 02:12. |
|
« Предыдущая тема | Следующая тема » |
|
|