我自己想出了一个解决方案,它也极大地改进了 EventSource 接口。
服务器端:不发送事件类型,只包含一个额外的数据字段(我总是使用 json)。所以而不是
event: eventName
data: {mykey: 'myvalue'}
我改为从服务器发送这个:
data: {mykey: 'myvalue', eventName: 'eventName'}
客户端:现在我可以使用 EventSource onmessage 回调,它会在每条没有事件类型的消息上触发。
对于绑定事件侦听器,我创建了一个具有 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.Events,此类中的事件处理功能更加强大。
使用示例:
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');
现在我有了一个易于处理、扩展、调试和测试的组件。