Как стать автором
Обновить

Комментарии 15

интересно. Мне такая идея пришла пару лет назад. И была успешно реализована :). Аналогичная тема была реализована и в JS.
Удобно — особенно я заценил на php — когда работал с multi-curl :)
А какие есть подобные реализации в js, не подскажите?
Например обработка события onclick :) через addEventListener туда можно затолкать субъектов, обзёрвером в данном случае выступает хозяин онклика.
Это да, но только для объектов из DOM, с новыми же объектами так не сделать… )

Ну и для новых можно сделать по аналогии, навскидку:
Subject = function() {
	// Приватный массив обзёрверов
	var observers = new Array();
	// Публичный метод подключения обзёрвера
	this.connect = function(signal, callback) {
		observers[signal] = observers[signal] || new Array();
		observers[signal][observers.length++] = callback;
	};
	// Публичный метод инициализации сигнала
	this.emit = function(signal) {
		for(i = 0, n = observers[signal].length; i < n; i++) {
			observers[signal][i]();
		}
	}
}

// Тестовый объект
SomeObject = function(test) {
	this.someMethod = function() {
		alert('turum-pum-pum');
	}
}
// Наследуем от субъекта
SomeObject.prototype = new Subject;

Obj = new SomeObject;
Obj.connect('click', function() { alert('tratata'); });
Obj.connect('click', function() { alert('tili-tili'); });
Obj.emit('click');
Obj.someMethod();

Быстро вы реагируете:)… да это как-то так и должно выглядеть…
Только при реализации чем дальше в лес тем больше ёлок… тоже такой код писал и столкнулся со следующими хотелками:

Иногда требуется чтобы подписчик выполнялся вне зависимости от того когда было сгенерировано событие до или после подписки

Есть противоположные события вроде hide show

У событий может быть дополнительный признак… например событие load должно иметь признак путь до файла который был загружен

При ассинхронной работе, появляются цепочки событий, например загрузи — загрузили — покажи — показали, которые начинают скрещиваться во времени и делать совсем не то что от них ожидается… особенно когда не закончилась одна цепочка, а появилась ещё одна…

Ещё бывает нужно подписываться на совпадение нескольких событий… например, файл загружен и на странице что-то показано и только тогда должен выполниться подписчик

Если сейчас идёт выполнение кода и пришёл клик пользователя, то у него должен быть какбы максимальный приоритет… и сразу должен выполняться код связанный с этим кликом и соответствующие события, а не ждать пока что-то доделается (если это возможно)

ИМХО :) вот интересно… есть ли библиотеки в которых есть подобные хотелки

Тьфу, терминологию попутал, наоборот совсем, обзёрверы — это то что затолкали через addEventListener, субъект — владелец addEventListener :)
в PEAR такое еще реализовано

pear.php.net/package/Event_SignalEmitter
Простота этого решения обманичива. Всегда не хватает для плагина, того или иного сигнала, чтобы генерировала система, приходиться все равно править ядро. К тому же очень часто нужно выбирать когда вызывать слот, до события или после (до вставки записи в БД или после), а все это породить множестные вызовы emit, там где надо и там где не надо (а вдруг понадобиться для плагинов)
Еще один минусом можно считать то, что отлаживать подобный код сложнее, если ошибка возникает во время генерации события, потому что не сразу видно все навешанные обработчики.

Данное решение более полезно там, где система «стоит» в ожидании внешних факторов. Будь то пользовательский интефейс, либо самописный http-сервер.
Странно что в статье ни слова про шаблон проектирования Наблюдатель (он же Observer), про стандартные интерфейсы тоже ни слова( interface SplObserver, interface SplSubject ).

Добавлю еще, что обмен сообщениями это еще и стандартный интеграционный паттерн.
Спасибо автору, тема интересная, а обсуждение намного позновательнее :)
пытаю некоторую слабость
Тут видимо автор не определился между «питаю» и «испытываю» :)
да точно, спасибо, поправлю :)
нууу это все очень похоже на события, немного похоже на хуки, все это очень хорошие решения для динамической связки отдельных компонентов системы, когда два разных компонента ничего не знают друг о друге но могут подписываться на события друг друга, с одной стороны большая гибкость но с другой стороны порой непросто отлаживать такие системы, как раз по причине отсутствия статической привязки компонентов
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории