2011-05-10 182 views
2

我有3个服务器发送的事件可用于页面。只有一个可以随时查看。我想停止3个事件流中的2个监听器,其中1个处于活动状态。 我有一个针对switch语句测试可见,但source.close()不能传递给我的事件直接,因为它被埋葬在一个函数:启动和停止服务器发送的事件通知

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

我希望有较少打开的连接服务器,尤其是在未查看数据的情况下。 如果你有更好的建议,我全都是耳朵!

最佳,

牛逼

回答

3
function onMessageHandler(event) { 
    if ("your want to close that EventSource") { 
    event.target.close(); 
    } 
} 
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 
}) 

最后,它取决于上下文。如果用户不会经常切换视图,或者消息非常大,那么您可能需要采取第二种方法。它将在管道中输入较少的数据,但在用户导航时创建和拆除连接。如果用户经常切换视图,或者您可以保持消息大小合理,那么我会主张复用,就像在第一个解决方案中一样。它将保持一个长时间连接,将不同类型的小消息推送给客户端。