繁体   English   中英

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

[英]Start and stop Server-sent events notification

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

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

我希望与服务器的开放连接减少,尤其是对于非查看数据。 如果您有更好的建议,我会全力以赴!

最好,

Ť

function onMessageHandler(event) {
  if ("your want to close that EventSource") {
    event.target.close();
  }
}

没有更多上下文,很难回答这个问题,但我会尽力而为。

您可以将事件资源视为传递所有消息并让客户端侦听特定事件的管道,从而有效地进行多路复用:

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

最后,它取决于上下文。 如果用户不想经常切换视图,或者消息真的很大,那么您可能想采用第二种方法。 它将减少管道中的数据输入,但在用户导航时创建和断开连接。 但是,如果用户经常切换视图,或者您可以使消息大小保持合理,那么我会提倡多路复用,就像第一个解决方案一样。 它将保持一个长期运行的连接,其中可以将不同类型的小消息推送到客户端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM