SignalR JavaScript 客户端通用触发器

SignalR JavaScript client universal trigger

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

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

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

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

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

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

使用一些 JavaScript 代码,您可以实现所需的功能,而不管 SignalR 开箱即用:

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);

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

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