【问题标题】:Signalr (1.0.0-alpha2) Hubs - Can you add client functions after connection has been started?Signalr (1.0.0-alpha2) Hubs - 你可以在连接开始后添加客户端功能吗?
【发布时间】:2012-11-09 22:44:57
【问题描述】:

使用 Signalr (1.0.0-alpha2),我想知道是否可以在连接启动后添加客户端功能。

假设我创建了连接并获取了代理。然后我将一些 Server Fired 客户端功能添加到集线器来做一些事情。然后我开始我的连接。然后我想向我的集线器对象添加更多的 Server Fired 函数。这可能吗?

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”变量发送到不同的对象。

现实生活示例:具有许多不同中心事件(新站点访问、聊天消息、站点错误)的仪表板。我在连接开始后“订阅”,然后将我的集线器代理传递给我所有不同的 UI 组件以处理它们特定的“消息类型”。我应该为这些创建单独的集线器,还是应该能够即时添加更多的 Server Fired 客户端功能?

【问题讨论】:

    标签: signalr signalr-hub


    【解决方案1】:

    我也有同样的情况。如果您尝试从多个位置调用它,您可能需要考虑添加另一种抽象布局。

    这是我想出的初步版本(打字稿)。

    我将从用法开始。 SignalRManager 是我的“经理”类,它抽象了我的 debuggingHub 集线器。我有一个在服务器上触发的客户端方法fooChanged

    在使用 SignalR 的模块中,我只调用了 start 方法,如果已经启动,则不会重新启动。

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

    您的“模块”只是通过管理器类注册其回调,并且只要触发 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;
            }
        }
    }
    

    注意:处理断开连接或连接丢失可能需要额外的工作。

    【讨论】:

      【解决方案2】:

      是的,你可以。使用 .on 方法。

      例子:

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

      如果您想稍后将其删除,请使用 .off 方法。

      【讨论】:

      • 您需要至少订阅一次才能调用 start。
      • @dfowler 是每个中心一个订阅还是总共一个订阅?订阅也只是意味着已经有一个服务器可以调用的功能吗?
      • 每个集线器。订阅意味着您在客户端定义了一个回调。
      猜你喜欢
      • 2018-07-03
      • 2021-12-05
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多