Я сам придумываю решение, которое также чрезвычайно улучшает интерфейс EventSource.
Серверная сторона : Не отправлять тип события, просто добавьте дополнительное поле данных (при этом я всегда использую json). Так что вместо
event: eventName
data: {mykey: 'myvalue'}
Вместо этого я отправляю это с сервера:
data: {mykey: 'myvalue', eventName: 'eventName'}
Клиентская сторона : теперь я могу использовать обратный вызов onmessage EventSource, который запускается для каждого сообщения, не имеющего тип события.
А для слушателей событий связывания я создаю класс-оболочку с функциональностью Backbone.Event. Результат:
// Server Sent Events (Event Source wrapper class)
var MyEventSource = (function() {
function MyEventSource(url) {
var self = this;
_.extend(this, Backbone.Events);
this.source = new EventSource(url);
this.source.onmessage = function(event) {
var data, eventName;
var data = JSON.parse(event.data);
var eventName = data.eventName; delete data.eventName;
// Now we can monitor all server sent events
console.log('app.server.on ', eventName, '. Data: ', data);
self.trigger(eventName, data);
};
}
return MyEventSource;
})();
Теперь с этим классом-оберткой я могу легко расширить функциональность, все события, отправленные сервером, можно легко отслеживать и благодаря расширению Backbone. События обработки событий в этом классе намного более мощные.
Пример использования:
var source = new MyEventSource('url/of/source');
// Add event listener
source.on('eventName', function(data) {
console.log(data);
});
// Fire a event (also very useful for testing and debugging!!)
source.trigger('eventName', { mykey: 'myvalue' });
// Unbind event listener (very important for complex applications)
source.off('eventName');
Теперь у меня есть компонент, который легко обрабатывать, расширять, отлаживать и тестировать.