Возможно ли улучшить событийную систему?
Я думаю, ни для кого не секрет, что событийная система содержит серьезный изъян - она не гарантирует распространение событий в той очередности, в которой они были испущены в коде.
Код AS3:
Да, зная, что событийная модель несовершенна, можно городить кучу проверок или, там где возможно, заранее выстраивать операции особым образом. Но меня интересует возможен ли фикс этого? Создаю событийную систему для моделей. Прикинул варианты: 1) В функции "dispathEvent" событие добавляется в глобальную очередь, и продолжается распространение события первого в очереди. Цитата:
2) Вместо "dispatchEvent" использовать "addToDispatchQueue(event:Event, callback:Function)". Цитата:
4) Ваш вариант |
Я делал CommandManager, в котором просто есть стэк команд, без всяких событий... Получается, что и callback особо не нужен, так как команде просто передается экземпляр "собственника события" (в числе прочих необходимых) и на .exec производятся все необходимые манипуляции.
Вообще, события не очень люблю.. Стараюсь использовать только когда это реально оправданно преимуществами баблинга, например. |
Насколько я помню события приходят в том порядке, в котором добовлялись слушатели т.е. путаница может случиться только если у тебя added и removed имеют одинаковый type что маловероятно. Можно минимальный пример когда события приходят не в том порядке?
|
4 аргумент - priority:
https://help.adobe.com/en_US/FlashPl...ventListener() Обычно таких зависимых событий немного, этого вполне хватает. |
В приведенном примере события отправляются совершенно упорядоченно: от самого вложенного (первое) до самого наружного (последнее).
Единственное, что приходится разруливать (я делал это... никогда) — это обработка одного и того же события от одного и того же объекта разными слушателями. В этом случае поможет комментарий от Tails. |
@ZergMaster, без минималистического примера - сложно понять. Что именно гарантирует, что во время выполнения одного стэка команд, не будет выполнен промежуточный стэк команд?
Цитата:
Цитата:
Цитата:
Цитата:
Если я сказал собеседнику две фразы, я ожидаю, что сперва он услышит первую фразу, а затем вторую. Однако событийная система такова, что к слушателю "фразы" прилетают рандомно. Это как читать книгу, предложения в которой перемешаны в случайном порядке. Приведу пример, есть контроллер, который создает зеркальную иерархию от существующей иерархии. Он слушает BaseModel. Казалось бы, по "added" он создает зеркало-"узел" и крепит его к зеркало-родителю, ссылка на которого есть у event.target.parent (модель-эталон). Но проблема в том, что у parent - может не быть этой ссылки на зеркало, ведь он еще сам не имеет зеркального узла, потому что внутри addChild был вызван еще один addChild (в обработчике события "added"). Таким образом, я должен, понимая, что событийная система имеет изъян, искать в цепи parent первую "отзеркаленную" модельку и выстраивать иерархию от нее. Это же вынуждает меня проверять, а не был ли event.target "отзеркален" в предыдущем обработчике. Более того, в контроллер может прилететь другое важное событие от модельки (которое было испущено в ее обработчике "added") тогда как она сама еще не имеет зеркало, что существенно. Я понимаю, что можно не испускать событий в обработчике "added" и не добавлять детей там же. Но речь не про самоограничения, а про работу событий так, как это должно быть с точки зрения здравого смысла. |
Цитата:
|
Цитата:
Код AS3:
handler 1 handler 2 НО Код AS3:
handler 2 handler 1 Для разруливания таких ситуаций и нужен параметр priority: Код AS3:
handler 1 handler 2 т.к. у onClick1 приоритет больше чем у onClick2 У тебя налицо непонимание event flow. UI события идут от корня(stage) до элемента их испустившего(capture phase),после этого событие начинает "всплывать",двигаясь от ребенка назад к корню(bubbling phase).По дефолту ты ловишь события в фазе всплытия потому у тебя и путаница.Если нужно ловить события в capture phase используй 3-ий параметр у addEventListener. |
Цитата:
Моя архитектура не хочет ничего того, что не естественно. Для простоты освоения программирования к нему нередко приводят параллели с реальностью. Вот и я хочу, чтобы моя первая сказанная фраза всегда была услышана первой, а не как придется. Акцентирую, я не утверждаю, что текущие события никуда не годятся. Я ищу вариант улучшения, если он возможен. @undefined, теряюсь, что сказать. Я знаю, как работает priority... Если вы потратите чуть больше времени, чем "беглый взгляд", на изучение кода в первом посте, а так же на пример с "дедом" и "правнуком"/"внуком" позже - вы поймете, что я спрашиваю кардинально о другом. |
Цитата:
|
Часовой пояс GMT +4, время: 04:47. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.