【问题标题】:SignalR JavaScript client universal triggerSignalR JavaScript 客户端通用触发器
【发布时间】:2015-05-15 20:08:05
【问题描述】:

我需要为每个 hub.client 方法附​​加一个事件。 例如:

 Hub.client.doSomething = function (e) {
          aFunction(e);
        };

    Hub.client.doSomethingElse = function (e) {
          aFunction(e);
        };

有没有一种方法可以将aFunction() 附加到客户端级别的所有客户端方法,而无需将函数放置在每个客户端方法中?

【问题讨论】:

  • 您能否澄清一下您是否希望将您的函数附加到您现有的处理程序,或者自动使用而不是定义处理程序?你说没有在每个客户端方法中放置函数,这让我认为你想要第二个选项,但也许你的意思是另一个。
  • 很抱歉给您带来了困惑。我希望任何新旧函数都能自动继承 aFunction()
  • Old or new 都表示“存在”,现在更清楚了。 Automatically 有点困难,我认为您必须对某些能够增强您的处理程序的东西进行某种调用,就像我建议的解决方案一样。

标签: javascript signalr


【解决方案1】:

我不知道在集线器代理上直接可用的此类回调,但您可以在 connection 对象上使用 received 回调。 (见list of connection lifetime eventsreceived definition

请注意,每次连接接收到数据时都会调用received 回调,这意味着,如果您有多个集线器,则当任何集线器向客户端发送数据时都会调用它。这意味着,您必须检查回调中收到的数据并决定是否应该处理这些数据(如果它属于给定的集线器,它是真实的消息,还是只是信号器内部消息)。

【讨论】:

    【解决方案2】:

    无论 SignalR 提供什么开箱即用的功能,您都可以通过一些 JavaScript 代码实现您所需要的:

    var extend = function (proxy, ex) {
        var keys = Object.keys(proxy.client),
            aop = function (p, k, f) {
                var prev = p[k];
                return function () {
                    f();
                    prev.apply(p, arguments);
                };
            };
    
        keys.forEach(function (k) {
            proxy.client[k] = aop(proxy.client, k, ex);
        });
    };
    
    extend(Hub, aFunction);
    

    在定义了 real 处理程序之后,在所有集线器代理上调用 extend 函数就足够了。

    通过更多的努力,这段代码可以变得更加可靠和通用,但我认为它应该已经让你朝着正确的方向前进。

    【讨论】:

    • 嗯,我可能以不同的方式理解问题。我假设,OP 不想在集线器上定义包罗万象的功能,所以他不必在其他地方定义任何东西。但这是个好主意,我可能会在其中一个项目中使用它:)
    • 这个解决方案确实只适用于定义的处理程序。如果根本没有定义任何处理程序,SignalR 实际上会使用快捷方式,因此要使其正常工作会很棘手,并且如果确实如此,它必须按照您描述的方式进行,即通过弄乱它的低级协议(这可能会在未来的版本,我不确定它是 public)。
    • 据我所知,它是公开的,因为它也可以在 C# 客户端 api 中使用。问题是,它似乎并没有被使用太多。因此,文档非常有限。
    • 同意,文档大多是由某些人完成的逆向工程(this one 看起来很准确)。很可能该协议将大部分保持不变,或者至少向后兼容,因此在其最稳定部分上编写的任何逻辑在未来都会非常顺利地工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多