Signalr проверяет, запущен ли концентратор

У меня есть несколько блоков javascript с функциями signalR.

Я не знаю порядок выполнения, так что я хочу запустить концентратор с

$.connection.hub.start();

если он еще не запущен.

Как проверить, запущен ли концентратор? Запустив его несколько раз, он выдает сообщение об ошибке.

Ответ 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()
}

Также обратите внимание, что при создании соединения он будет находиться в состоянии "отключен" /4 до тех пор, пока на него не будет вызван запуск. Когда вызывается старт, соединение, по-видимому, будет пытаться постоянно подключаться (если оно прерывается) до тех пор, пока не будет вызван вызов $.connection.hub.stop() (затем вернется в состояние "отключено" ).

работ:

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

Ответ 2

Вы можете обнаружить, когда концентратор начал использовать .done()

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

используя этот метод, вы можете сделать следующее (взято из docs: 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!");
                 });

Ответ 3

Вы можете проверить состояние соединения в каждой из ваших функций, например:

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