2013-02-25 16 views
16

Ho più blocchi JavaScript con funzioni signalR.Signalr verifica se l'hub è già avviato

non so l'ordine di esecuzione in modo che io voglio iniziare il mozzo con

$.connection.hub.start();

, se non è già iniziato.

Come posso verificare se l'hub è già stato avviato? L'avvio più volte genera un errore.

risposta

56

Ci sono alcuni modi per affrontare questo problema. Il primo è quello di creare le proprie variabili personali di monitoraggio dello stato della connessione, che si imposta con gli eventi di connessione di callback:

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

È possibile controllare ConnectionStarted prima di tentare di avviare la connessione. Sfortunatamente, questo non funzionerà bene, dato che start() è asincrono e così tante istanze potrebbero provare ad avviare una connessione prima che sia terminata e impostare ConnectionStart su true.

Quindi, soluzioni di lavoro. Ci sono due. In primo luogo, hanno ogni caso utilizzare un proprio oggetto di connessione (vale a dire: non utilizzare il $ .connection.hub di default, ma invece utilizzare manuale creatore di connessione:

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

Questo non è grande, come la maggior parte dei browser hanno una numero limitato di connessioni consentite per pagina e anche perché è generalmente eccessivo.

IMO, la soluzione migliore è utilizzare la singola connessione automatica con proxy predefinito ($ .connection.hub) e controllare lo stato della connessione (qualcosa I appena trovato) Ogni oggetto di connessione ha uno stato:

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

Quindi, in ogni caso, andare a fare qualcosa di simile ?:

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

Si noti inoltre che quando si crea una connessione, si siederà nello stato "disconnesso"/4 fino a inizio è chiamato su di esso. Una volta chiamato, la connessione cercherà apparentemente di riconnettersi costantemente (se viene interrotta) fino a quando non viene chiamato $ .connection.hub.stop() (tornerà quindi allo stato "disconnected").

Refs:

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

3

È possibile rilevare quando il mozzo ha iniziato a utilizzare .done()

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

utilizzando questo metodo, è possibile effettuare le seguenti operazioni (Tratto da docs: https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs) è quindi possibile tenere traccia di se la connessione è apriti.

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

questo non funziona con .done più chiamate – daniel

+1

multiple? Puoi spiegare? – LiamB

+1

Ho più blocchi javascript da diverse pagine html parziali generate da server.Non conosco l'ordine di esecuzione del blocco di script. Quindi non so da dove iniziare il mio hub. – daniel

2

È possibile controllare lo stato della connessione in ognuna delle vostre funzioni come:

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

Questo non è molto buono in quanto lo stato potrebbe essere "connesso", e si spara un altro avvio, che si interromperà.Meglio fare come dpb. Verificare che sia disconnesso prima di provare a connect –

+0

@ BjørnØyvindHalvorsen modificato in base al tuo feedback –

Problemi correlati