web-dev-qa-db-fra.com

Signalr vérifier si le hub a déjà démarré

J'ai plusieurs blocs javascript avec des fonctions signalR.

Je ne connais pas l'ordre d'exécution pour que je veuille démarrer le hub avec

$.connection.hub.start();

s'il n'est pas déjà démarré.

Comment puis-je vérifier si le hub est déjà démarré? En le démarrant plusieurs fois, il génère une erreur.

23
daniel

Il existe plusieurs façons d'aborder ce problème. La première consiste à créer vos propres variables de suivi de l'état de la connexion, que vous définissez avec les événements de rappel de connexion:

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

Vous pouvez vérifier ConnectionStarted avant d'essayer de démarrer la connexion. Malheureusement, cela ne fonctionnera pas bien, car start () est asynchrone et de nombreuses instances pourraient essayer de démarrer une connexion avant la fin de la connexion et définir ConnectionStart sur true.

Donc, des solutions de travail. Il y en a deux. Tout d'abord, demandez à chaque instance d'utiliser son propre objet de connexion (c'est-à-dire: n'utilisez pas le $ .connection.hub par défaut, mais utilisez plutôt le créateur de connexion manuelle:

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

Ce n'est pas génial, car la plupart des navigateurs ont un nombre limité de connexions autorisées par page, et aussi parce que c'est généralement excessif.

OMI, la meilleure solution consiste à utiliser la connexion automatique unique avec le proxy par défaut ($ .connection.hub) et à regarder l'état de la connexion (quelque chose que je viens de rencontrer). Chaque objet de connexion a un état:

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

Donc, dans chaque cas, optez pour quelque chose comme ça?:

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

Notez également que lorsque vous créez une connexion, elle restera dans l'état "déconnecté"/4 jusqu'à ce que le démarrage soit appelé. Une fois que start est appelé, la connexion essaiera apparemment de se reconnecter constamment (si elle est interrompue) jusqu'à ce que $ .connection.hub.stop () soit appelé (puis reviendra à l'état "déconnecté").

Réfs:

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

68
dpb

Vous pouvez détecter quand le concentrateur a commencé à utiliser .done ()

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

en utilisant cette méthode, vous pouvez faire ce qui suit (Tiré des documents: https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs ) vous pouvez ensuite suivre si la connexion est ouverte vous-même.

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

Vous pouvez vérifier l'état de connexion dans chacune de vos fonctions comme:

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