我有多个带有 signalR 函数的 javascript 块。
我不知道执行顺序,所以我想启动集线器
$.connection.hub.start();
如果它还没有开始。
如何检查集线器是否已经启动?多次启动它会引发错误。
我有多个带有 signalR 函数的 javascript 块。
我不知道执行顺序,所以我想启动集线器
$.connection.hub.start();
如果它还没有开始。
如何检查集线器是否已经启动?多次启动它会引发错误。
有几种方法可以解决这个问题。首先是创建您自己的连接状态跟踪变量,您可以使用连接回调事件进行设置:
$.connection.hub.start().done(function() { ConnectionStarted = true; })
您可以在尝试开始连接之前检查 ConnectionStarted。不幸的是,这不会很好地工作,因为 start() 是异步的,因此许多实例可能会在一个连接完成之前尝试启动连接并将 ConnectionStart 设置为 true。
所以,工作解决方案。那里有两个。首先,让每个实例都使用自己的连接对象(即:不要使用默认的 $.connection.hub,而是使用手动连接创建器:
var localConnection = $.hubConnection();
var localHubProxy= localConnection.createHubProxy('HubNameHere');
这不是很好,因为大多数浏览器每页允许的连接数量有限,而且它通常是矫枉过正的。
IMO,最好的解决方案是使用带有默认代理($.connection.hub)的单个自动连接并查看连接状态(我刚刚遇到的东西)。每个连接对象都有一个状态:
$.signalR.connectionState
Object {connecting: 0, connected: 1, reconnecting: 2, disconnected: 4}
所以,在每种情况下,都选择这样的东西吗?:
if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
$.connection.hub.start()
}
另请注意,当您创建连接时,它将处于“断开连接”/ 4 状态,直到对其调用 start 。一旦调用 start ,连接显然会不断尝试重新连接(如果它被中断),直到调用 $.connection.hub.stop() (然后将返回状态“断开连接”)。
参考:
http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-javascript-client#establishconnection https://github.com/SignalR/SignalR/wiki
您可以检查每个功能中的连接状态,例如:
function doSomething {
if ($.connection.hub.state === $.signalR.connectionState.disconnected) {
$.connection.hub.start().done(function () { myHub.server.myHubMethod(); });
}
else {
myHub.server.myHubMethod();
}
}
您可以使用 .done() 检测集线器何时开始
$.connection.hub.start().done(function () {
});
使用此方法,您可以执行以下操作(取自文档:https ://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs ),然后您可以自己跟踪连接是否打开。
function connectionReady() {
alert("Done calling first hub serverside-function");
};
$.connection.hub.start()
.done(function() {
myHub.server.SomeFunction(SomeParam) //e.g. a login or init
.done(connectionReady);
})
.fail(function() {
alert("Could not Connect!");
});