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
函数就足够了。
通过更多的努力,这段代码可以变得更加可靠和通用,但我认为它应该已经把你引向了正确的方向。
我需要为每个 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
函数就足够了。
通过更多的努力,这段代码可以变得更加可靠和通用,但我认为它应该已经把你引向了正确的方向。