启动和停止服务器发送的事件通知

时间:2011-05-10 18:25:58

标签: javascript html5 server-sent-events

我有3个服务器发送的事件可用于页面。任何时候只有一个可见。当其中一个事件流处于活动状态时,我想在3个事件流中的2个上停止监听器。 我有一个switch语句测试可见但是不能直接将source.close()传递给我的事件,因为它被隐藏在一个函数中:

var firstEventSource = function() { 
    var eventSrc = new EventSource('firstSTREAM.php');
    eventSrc.addEventListener('message', onMessageHandler);
};

我希望与服务器的打开连接更少,特别是对于未查看的数据。 如果你有更好的建议,我会全力以赴!

最佳,

Ť

2 个答案:

答案 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
})

最后,它取决于背景。如果用户不打算经常切换视图,或者消息非常大,那么您可能想要采用第二种方法。它会向管道输送较少的数据,但会在用户导航时创建和拆除连接。但是,如果用户经常切换视图,或者您可以保持消息大小合理,那么我提倡多路复用,就像在第一个解决方案中一样。它将保持一个长时间运行的连接,其中不同类型的小消息可能被推送到客户端。