当使用
Server-Sent Events时,如果客户端建立多个连接以接收它感兴趣的不同事件,或者应该有一个连接,并且客户端通过单独的通道显示什么感兴趣的话? IMO后者似乎更为可取,尽管有些可能使客户端代码更加复杂.该规范支持命名事件(与特定主题相关的事件),对我来说,建议将服务器发送事件连接用作所有事件的单个通道.
以下代码说明了启动多个服务器发送事件连接的第一种情况:
var EventSource eventSource1 = new EventSource("events/topic1"); eventSource1.addEventListener('topic1',topic1Listener,false); var EventSource eventSource2 = new EventSource("events/topic2"); eventSource2.addEventListener('topic2',topic2Listener,false);
eventSource1将收到“topic1”事件,eventSource2将收到“topic2”事件.虽然这很简单,但是对于您感兴趣的每个主题,都会发生挂起的GET,效率也非常低.
替代方案如下:
var EventSource eventSource3 = new EventSource("/events?id=1234") eventSource3.addEventListener('topic3',topic3Listener,false); eventSource3.addEventListener('topic4',topic4Listener,false); var subscription = new XMLHttpRequest(); subscription.open("PUT","/events/topic3?id=1234",true); subscription.send();
在此示例中,单个EventSource将存在,并且特定事件的兴趣将由具有Server-Sent事件连接的单独请求指定,并且注册由id参数相关联. topic3Listener将收到“topic3”事件,topic4Listener不会.虽然要求稍微更多的代码是有益的,只有一个连接,但事件仍然可以被识别和处理不同.
在网络上有一些示例显示使用命名事件,但似乎事件名称(或主题)是事先知道的,所以不需要客户端注册与服务器的兴趣(example).虽然我还没有看到一个显示多个EventSource对象的示例,但我还没有看到一个示例,显示客户端使用单独的请求来注册特定主题的兴趣,正如我在上面做的.我对规范的解释使我相信,表示对某个主题(或事件名称)的兴趣完全取决于开发人员,并且可以静静地与客户端了解其将要接收的事件的名称,动态地与客户端通知服务器它感兴趣接收特定事件.
我会很乐意听别人的想法.注意:我通常是一个Java开发人员,所以请原谅我平庸的JS代码..