簡體   English   中英

Signalr 檢查集線器是否已經啟動

[英]Signalr check if hub already started

我有多個帶有signalR 函數的javascript 塊。

我不知道執行順序,所以我想啟動集線器

$.connection.hub.start();

如果它還沒有開始。

如何檢查集線器是否已啟動? 多次啟動它會引發錯誤。

有幾種方法可以解決這個問題。 第一個是創建您自己的連接狀態跟蹤變量,您可以使用連接回調事件設置這些變量:

$.connection.hub.start().done(function() { ConnectionStarted = true; })

您可以在嘗試啟動連接之前檢查 ConnectionStarted。 不幸的是,這不會很好地工作,因為 start() 是異步的,因此許多實例可能會在連接完成之前嘗試啟動連接並將 ConnectionStart 設置為 true。

所以,工作解決方案。 那里有兩個。 首先,讓每個實例使用自己的連接對象(即:不要使用默認的 $.connection.hub,而是使用手動連接創建者:

var localConnection = $.hubConnection(); 
var localHubProxy= localConnection.createHubProxy('HubNameHere');

這不是很好,因為大多數瀏覽器每個頁面允許的連接數量有限,而且通常是矯枉過正。

IMO,最好的解決方案是使用帶有默認代理($.connection.hub)的單一自動連接並查看連接狀態(我剛剛遇到的)。 每個連接對象都有一個狀態:

$.signalR.connectionState
Object {connecting: 0, connected: 1, reconnecting: 2, disconnected: 4}

因此,在每種情況下,請執行以下操作?:

if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
  $.connection.hub.start()
}

另請注意,當您創建連接時,它將處於“已斷開連接”/ 4 狀態,直到對其調用 start。 一旦 start 被調用,連接顯然會不斷嘗試重新連接(如果它被中斷),直到 $.connection.hub.stop() 被調用(然后將返回到“斷開連接”狀態)。

參考:

http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-javascript-client#buildingconnection https://github.com/SignalR/SignalR/wiki

您可以使用 .done() 檢測集線器何時開始

$.connection.hub.start().done(function () {
});

使用此方法,您可以執行以下操作(取自文檔: https : //github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs )然后您可以跟蹤自己是否打開了連接。

function connectionReady() {
    alert("Done calling first hub serverside-function");
};

$.connection.hub.start()
                .done(function() {
                    myHub.server.SomeFunction(SomeParam) //e.g. a login or init
                         .done(connectionReady); 
                })
                .fail(function() {
                    alert("Could not Connect!");
                 });

您可以在每個函數中檢查連接狀態,例如:

function doSomething {
        if ($.connection.hub.state === $.signalR.connectionState.disconnected) {
            $.connection.hub.start().done(function () { myHub.server.myHubMethod(); });
        }
        else {
            myHub.server.myHubMethod();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM