Показать сообщение отдельно
Старый 12.06.2018, 06:46
robotR2D2 вне форума Посмотреть профиль Отправить личное сообщение для robotR2D2 Найти все сообщения от robotR2D2
  № 1  
Ответить с цитированием
robotR2D2

Регистрация: May 2016
Сообщений: 25
По умолчанию Возможно ли улучшить событийную систему?

Я думаю, ни для кого не секрет, что событийная система содержит серьезный изъян - она не гарантирует распространение событий в той очередности, в которой они были испущены в коде.
Код AS3:
	var s:Sprite = new Sprite();
	s.name = "Parent";
	s.addEventListener(Event.ADDED, this._onAdded);
 
	var schSprite:Sprite = new Sprite();
	sch.name = "Child";
	sch.addEventListener(Event.ADDED, this._onChildAdded);
	s.addChild(sch);
 
	__________________________________
 
	function _onAdded(e:Event):void {
		var s:Sprite = e.target as Sprite;
		trace(e.type, s.name);
	}
 
	function _onChildAdded(e:Event):void {
		s.removeEventListener(e.type, this._onChildAdded);
 
		var s:Sprite = e.target as Sprite;
		var s2:Sprite = new Sprite();
		s2.name = "subChild";
		s.addChild(s2);
	}
 
	//output:
	//added, subChild
	//added, Child
Таким образом наверх (да и внутри объекта, испустившего событие) прилетают события абы как. Для связанных событий - это может быть критично. Например, может прилететь "removed" вперед "added".
Да, зная, что событийная модель несовершенна, можно городить кучу проверок или, там где возможно, заранее выстраивать операции особым образом. Но меня интересует возможен ли фикс этого?

Создаю событийную систему для моделей. Прикинул варианты:
1) В функции "dispathEvent" событие добавляется в глобальную очередь, и продолжается распространение события первого в очереди.
Цитата:
Плюс: в коде дальше "dispatchEvent" можно рассчитывать на то, что событие распространилось.
Минус: не гарантируется, что первичные получатели события его обработали ДО того, как событие прилетело к следующим.
Минус очень жирный...

2) Вместо "dispatchEvent" использовать "addToDispatchQueue(event:Event, callback:Function)".
Цитата:
Плюс: события распространяются в той последовательности, в которой были испущены; обрабатываются полностью каждым участником в цепи.
Минус: собственник события не знает, когда его событие распространится и вынужден подписать callback на случай, если ему нужно выполнить действия после фактического распространения события.
3) Продолжать мириться с существующей системой
4) Ваш вариант