每个事件具有多个事件处理程序的SignalR

SignalR with multiple event handlers per event

本文关键字:程序 SignalR 事件处理 事件      更新时间:2024-02-14

在C#中,我会将许多处理程序挂接到这样的事件:

event += firstEventHandler;
event += secondEventHandler;

但是我们用SignalR编写的JavaScript:

$.connection.someHubName.client.someEventName = function (item) {
    console.log("someMessage", item);
};

我创建了一个看起来有点像这样的包装器:

var signalRClient = {
    start: function (callback) {
        $.connection.hub.url = ajaxHttp + "/signalr";
        $.connection.hub.logging = true;
        if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
            $.connection.hub.start({ jsonp: true, withCredentials: true, transport: ['webSockets', 'longPolling'] }).done(callback);
        } else {
            callback();
        }
    },
    connection: $.connection
}

我可以用这种方式打电话:

signalRClient.connection.somehub.client.someEvent = function (item) {
    console.log("someMessage", item);
};
signalRClient.start(function () { 
    signalRClient.connection.somehub.server.subscribe(someId);
});

但是,如果我在多个视图中(在同一个呈现的页面上)运行signalRClient,它只能为一个事件分配一个函数。我希望能够为一个事件分配多个功能。

我已阅读:通过多个连接++连接到信号机集线器和signalr客户端

但我认为,为此目的创建多个到同一集线器的连接不是一个好主意。我也会尽量避免在布局中创建SignalR代码,并使所有视图都依赖于此。

有没有一个简单的解决方案可以让我将许多事件处理程序挂接到$.connection.somehub.client.event

在尝试了许多不同的事情后,我成功地使用了.on(命令)。它是这样完成的:

signalRClient.connection.somehub.on("someevent", function(item) {
    console.log(item);
});
signalRClient.connection.somehub.on("someevent", function (item) {
    console.log(item);
});

这将在控制台中为每个事件提供两行。