2013-02-25 46 views
16

我有多個具有signalR功能的JavaScript塊。信號器檢查集線器是否已啓動

我不知道,這樣我想與

$.connection.hub.start();

啓動樞紐,如果它不是已經開始執行的順序。

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

回答

56

有幾種方法可以解決這個問題。首先是要創建自己的連接狀態跟蹤變量,其中設置有連接回調事件:

$.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,直到開始坐在叫做就可以了。一旦啓動被調用,連接將顯然嘗試不斷重新連接(如果它被中斷),直到$ .connection.hub.stop()被調用(然後將返回到「已斷開」狀態)。

參考文獻:

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

3

當輪轂也採用.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!"); 
       }); 
+1

這並不多.done工作電話 – daniel 2013-02-25 12:23:38

+1

多?你可以解釋嗎? – LiamB 2013-02-25 12:24:16

+1

我有不同的服務器生成的部分HTML頁面的多個JavaScript塊。我不知道腳本塊執行的順序。所以我不知道從哪裏開始我的中心。 – daniel 2013-02-25 12:25:47

2

您可以檢查您的每一個功能,如連接狀態:

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

這不是很好,因爲狀態可能是'連接',並且您會啓動另一個啓動,這將會崩潰,最好像dpb一樣執行。連接。 – 2016-10-13 09:21:17

+0

@BjørnØyvindHalvorsen根據您的反饋編輯 – 2016-10-13 09:32:52