这个问题是很难没有更多的背景来回答,但我会尽我所能。
你能想到的事件资源的地方你把你所有的消息的管道,并让客户端侦听特定的事件,有效地复用:
var handler = console.log.bind(console)
, events = new EventSource("/events")
events.addEventListener("new-friend", handler)
events.addEventListener("new-message", handler)
events.addEventListener("new-notification", handler)
这将减少你的连接数到只有一个,并且可以在切换视图时节省昂贵的重新连接。但是,它的缺点是你的服务器将(可能)不必要的数据推向管道。毕竟,您一次只能查看一种消息类型。你应该考虑这是否是一个实际问题。如果你的用户界面应该更新,也许有一些徽章通知(如Facebook的消息或通知图标),那么即使用户可能没有主动使用该特定视图,也需要了解这些消息。无论如何,你应该尽量保持消息的性能。
如果不能或不会倒推同一管道的所有消息,你应该与你有多个资源或查询相关资源的能力,然后再打开的最初的想法去并关闭连接。请记住,这可能会非常昂贵,因为客户端可能最终要求服务器敲击。每个视图更改都会导致连接被设置并撕下。它看起来像这样:
/* Assuming jquery is available and with the following html:
* <a class="stream" href="/friends>Friends</a>
* <a class="stream" href="/messages>Messages</a>
* <a class="stream" href="/notifications>Notifications</a>
*/
var currentEvents
, handler = console.log.bind(console)
$("a.stream").on("click", function() {
$el = $(this)
currentEvents && currentEvents.close()
currentEvents = new EventSource($el.attr("href"))
currentEvents.addEventListener("message", handler)
return false
})
最后,它取决于上下文。如果用户不会经常切换视图,或者消息非常大,那么您可能需要采取第二种方法。它将在管道中输入较少的数据,但在用户导航时创建和拆除连接。如果用户经常切换视图,或者您可以保持消息大小合理,那么我会主张复用,就像在第一个解决方案中一样。它将保持一个长时间连接,将不同类型的小消息推送给客户端。