我有3个服务器发送的事件可用于页面。任何时候只有一个可见。当其中一个事件流处于活动状态时,我想在3个事件流中的2个上停止监听器。 我有一个switch语句测试可见但是不能直接将source.close()传递给我的事件,因为它被隐藏在一个函数中:
var firstEventSource = function() {
var eventSrc = new EventSource('firstSTREAM.php');
eventSrc.addEventListener('message', onMessageHandler);
};
我希望与服务器的打开连接更少,特别是对于未查看的数据。 如果你有更好的建议,我会全力以赴!
最佳,
Ť
答案 0 :(得分:4)
function onMessageHandler(event) {
if ("your want to close that EventSource") {
event.target.close();
}
}
答案 1 :(得分:2)
如果没有更多背景,这个问题很难回答,但我会尽我所能。
您可以将事件资源视为管道,您可以在其中推送所有消息,并让客户端侦听特定事件,从而有效地进行多路复用:
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
})
最后,它取决于背景。如果用户不打算经常切换视图,或者消息非常大,那么您可能想要采用第二种方法。它会向管道输送较少的数据,但会在用户导航时创建和拆除连接。但是,如果用户经常切换视图,或者您可以保持消息大小合理,那么我提倡多路复用,就像在第一个解决方案中一样。它将保持一个长时间运行的连接,其中不同类型的小消息可能被推送到客户端。