簡體   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