javascript - hubs - Comprobación de Signalr si el hub ya está iniciado
signalr javascript (3)
Tengo múltiples bloques de javascript con funciones signalR.
No sé el orden de ejecución, así que quiero iniciar el hub con
$.connection.hub.start();
si aún no se ha iniciado.
¿Cómo puedo comprobar si el hub ya está iniciado? Al iniciarlo varias veces se produce un error.
Hay algunas maneras de abordar este problema. La primera es crear sus propias variables de seguimiento de estado de conexión, que configura con los eventos de devolución de llamada de conexión:
$.connection.hub.start().done(function() { ConnectionStarted = true; })
Puede verificar ConnectionStarted antes de intentar iniciar la conexión. Desafortunadamente, esto no funcionará bien, ya que start () es asíncrono y muchas instancias podrían intentar iniciar una conexión antes de que una haya finalizado y establecer ConnectionStart en verdadero.
Por lo tanto, soluciones de trabajo. Hay dos. Primero, haga que cada instancia use su propio objeto de conexión (es decir, no use el $ .connection.hub predeterminado, sino que use el creador de la conexión manual)
var localConnection = $.hubConnection();
var localHubProxy= localConnection.createHubProxy(''HubNameHere'');
Esto no es excelente, ya que la mayoría de los navegadores tienen un número limitado de conexiones permitidas por página, y también porque generalmente es excesivo.
En mi opinión, la mejor solución es usar la conexión automática única con el proxy predeterminado ($ .connection.hub) y observar el estado de la conexión (algo que acabo de encontrar). Cada objeto de conexión tiene un estado:
$.signalR.connectionState
Object {connecting: 0, connected: 1, reconnecting: 2, disconnected: 4}
Entonces, ¿en cada caso, ir por algo como esto ?:
if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
$.connection.hub.start()
}
También tenga en cuenta que cuando cree una conexión, se sentará en estado "desconectado" / 4 hasta que se inicie en ella. Una vez que se llama el inicio, la conexión aparentemente intentará reconectarse constantemente (si se interrumpe) hasta que se llame a $ .connection.hub.stop () (luego volverá al estado "desconectado").
Refs:
http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-javascript-client#establishconnection https://github.com/SignalR/SignalR/wiki
Puedes detectar cuando el hub ha comenzado a usar .done ()
$.connection.hub.start().done(function () {
});
utilizando este método, puede hacer lo siguiente (Tomado de los documentos: https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs ) luego puede hacer un seguimiento de si la conexión está abierta.
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!");
});
Puedes verificar el estado de conexión en cada una de tus funciones como:
function doSomething {
if ($.connection.hub.state === $.signalR.connectionState.disconnected) {
$.connection.hub.start().done(function () { myHub.server.myHubMethod(); });
}
else {
myHub.server.myHubMethod();
}
}