当使用 服务器发送事件 时,客户端应该建立多个连接来接收它感兴趣的不同事件,还是应该有一个单一的连接,并且客户端通过一个单独的通道指示它所感兴趣的内容?在我看来,后者似乎更可取,尽管对于某些人来说,这可能会使客户端代码更加复杂。规范支持命名事件(与特定主题相关的事件),这表明服务器发送事件连接应该用作所有事件的单一通道。
以下代码说明了第一种情况,即启动多个服务器发送事件连接:
eventSource1会接收"topic1"事件,而eventSource2会接收"topic2"事件。虽然这很简单直观,但对于每个你感兴趣的主题都需要挂起GET请求,这也相当低效。另一种选择是以下方式:
在这个例子中,将存在一个单一的EventSource,并且对特定事件的兴趣将通过使用Server-Sent Event连接的单独请求以及与id参数相关联的注册来指定。topic3Listener将接收"topic3"事件,而topic4Listener则不会。虽然需要稍微多写一些代码,但好处是只建立了一个连接,但事件仍然可以被识别和处理得不同。
网络上有很多示例展示了命名事件的使用,但似乎事件名称(或主题)是预先知道的,因此客户端无需向服务器注册兴趣(example)。虽然我还没有看到显示多个EventSource对象的示例,但我也没有看到一个示例,显示客户端使用单独的请求来注册对特定主题的兴趣,就像我上面所做的那样。我对规范的解释是,表明对某个主题(或事件名称)的兴趣完全取决于开发人员,并且可以使用客户端静态地知道它要接收的事件的名称或动态地告知服务器它有兴趣接收特定事件。
以下代码说明了第一种情况,即启动多个服务器发送事件连接:
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 Event连接的单独请求以及与id参数相关联的注册来指定。topic3Listener将接收"topic3"事件,而topic4Listener则不会。虽然需要稍微多写一些代码,但好处是只建立了一个连接,但事件仍然可以被识别和处理得不同。
网络上有很多示例展示了命名事件的使用,但似乎事件名称(或主题)是预先知道的,因此客户端无需向服务器注册兴趣(example)。虽然我还没有看到显示多个EventSource对象的示例,但我也没有看到一个示例,显示客户端使用单独的请求来注册对特定主题的兴趣,就像我上面所做的那样。我对规范的解释是,表明对某个主题(或事件名称)的兴趣完全取决于开发人员,并且可以使用客户端静态地知道它要接收的事件的名称或动态地告知服务器它有兴趣接收特定事件。
我很想听听其他人对这个话题的想法。注:我通常是Java开发人员,所以请原谅我的平庸JS代码.. :)