web-dev-qa-db-ja.com

ハブがすでに開始されているかどうかのシグナルチェック

SignalR関数を持つ複数のjavascriptブロックがあります。

実行順序がわからないので、ハブを開始したい

$.connection.hub.start();

まだ開始されていない場合。

ハブが既に開始されているかどうかを確認するにはどうすればよいですか?複数回起動するとエラーがスローされます。

23
daniel

この問題に対処する方法はいくつかあります。 1つは、接続コールバックイベントで設定する独自の接続ステータス追跡変数を作成することです。

$.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()
}

接続を作成すると、startが呼び出されるまで、接続は「disconnected」/ 4の状態になります。 startが呼び出されると、$。connection.hub.stop()が呼び出されるまで(接続が中断された場合)、接続は常に再接続を試みます(その後、「切断」状態に戻ります)。

参照:

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

68
dpb

.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!");
                 });
5
LiamB

次のような各関数で接続状態を確認できます。

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