SignalR JavaScript客户端通用触发器

时间:2015-05-14 00:45:14

标签: javascript signalr

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使用一些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函数就足够了。

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