Концентраторы Signalr (1.0.0-alpha2) - можно ли добавлять клиентские функции после запуска соединения?


Используя Signalr (1.0.0-alpha2), я хочу знать, можно ли добавить клиентские функции после запуска соединения.

Скажем, я создаю свое соединение и хватаю прокси. Затем я добавляю некоторые серверные клиентские функции в концентратор, чтобы сделать несколько вещей. Затем я начинаю свою связь. Затем я хочу добавить еще несколько серверных функций к моему объекту концентратора. Возможно ли это?

var myHub= $.connection.myHub;
myHub.SomeClientFunction = function() {
   alert("serverside called 'Clients.SomeClientFunction()'");
};
$.connection.hub.start()
   .done(function() {
      myHub.SomeNewClientFunction = function() {
        alert("serverside called 'Clients.SomeNewClientFunction()'");
      }
    })

Этот пример не реалистичен, но я в основном хочу отправить свою переменную myHub в a другой объект после запуска хаба подписывается на новые события, которые исходному коду были безразличны.

Реальный пример: панель мониторинга с рядом различных событий концентратора (новые посещения сайта, сообщение чата, ошибка сайта). Я "подписываюсь" после запуска соединения, а затем передаю свой прокси-сервер-концентратор всем моим различным компонентам пользовательского интерфейса для обработки их конкретных "типов сообщений". Должен ли я создавать отдельные концентраторы для них или я должен иметь возможность добавить больше серверных клиентских функций на муха?

2 8

2 ответа:

Да, вы можете. Используйте.по методам.

Пример:

myHub.on('somethingNew', function() {
    alert("This was called after the connection started!");
});

Если вы хотите удалить его позже, используйте .выключите метод.

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

Вот предварительная версия того, что я придумал (машинопись).

Я начну с использования. SignalRManager - это мой класс "менеджер", который абстрагирует мой хаб debuggingHub. У меня есть клиентский метод fooChanged, который запускается на сервере.

Где-то в модуле, использующем SignalR, я просто вызываю метод start, который не является перезапускается, если уже запущен.

// ensure signalR is started
SignalRManager.start().done(() =>
{
    $.connection.debuggingHub.server.init();
});

Ваш "модуль" просто регистрирует свой обратный вызов через класс manager, и всякий раз, когда запускается метод клиента SignalR, вызывается обработчик.

// handler for foo changed
SignalRManager.onFooChanged((guid: string) =>
{
    if (this.currentSession().guid == guid)
    {
        alert('changed');
    }
});   

Это простая версия SignalRManager, которая использует jQuery $.Callbacks для передачи запроса на столько модулей, сколько у вас есть. Конечно, вы можете использовать любой механизм, но этот кажется самым простым.

module RR 
{ 
    export class SignalRManager
    {
        // the original promise returned when calling hub.Start
        static _start: JQueryPromise<any>;

        private static _fooChangedCallback = $.Callbacks();

        // add callback for 'fooChanged' callback
        static onfooChanged(callback: (guid: string) => any)
        {
            SignalRManager._fooChangedCallback.add(callback);
        }

        static start(): JQueryPromise<any>
        {
            if (!SignalRManager._start)
            {
                // callback for fooChanged
                $.connection.debuggingHub.client.fooChanged = (guid: string) =>
                {
                    console.log('foo Changed ' + guid);
                    SignalRManager._fooChangedCallback.fire.apply(arguments);                    
                };

                // start hub and save the promise returned
                SignalRManager._start = $.connection.hub.start().done(() =>
                {
                    console.log('Signal R initialized');
                });
            }

            return SignalRManager._start;
        }
    }
}

Примечание: может потребоваться дополнительная работа для обработки разъединений или связи потеряны.