信号器检查集线器是否已启动

dan*_*iel 24 javascript signalr

我有多个带有signalR功能的javascript块.

我不知道执行的顺序,所以我想启动集线器

$.connection.hub.start();

如果它还没有开始.

如何检查集线器是否已经启动?多次启动它会引发错误.

dpb*_*dpb 70

有几种方法可以解决这个问题.第一种是创建自己的连接状态跟踪变量,使用连接回调事件设置:

$.connection.hub.start().done(function() { ConnectionStarted = true; })
Run Code Online (Sandbox Code Playgroud)

您可以在尝试启动连接之前检查ConnectionStarted.不幸的是,这不会很好,因为start()是异步的,因此许多实例可能会尝试在完成连接之前启动连接并将ConnectionStart设置为true.

所以,工作解决方案.那里有两个.首先,让每个实例都使用自己的连接对象(即:不要使用默认的$ .connection.hub,而是使用手动连接创建器:

var localConnection = $.hubConnection(); 
var localHubProxy= localConnection.createHubProxy('HubNameHere');
Run Code Online (Sandbox Code Playgroud)

这并不是很好,因为大多数浏览器每页允许的连接数量有限,而且因为它通常是矫枉过正的.

IMO,最好的解决方案是使用默认代理($ .connection.hub)的单一自动连接,并查看连接状态(我刚刚遇到的事情).每个连接对象都有一个状态:

$.signalR.connectionState
Object {connecting: 0, connected: 1, reconnecting: 2, disconnected: 4}
Run Code Online (Sandbox Code Playgroud)

那么,在每种情况下,去寻找这样的东西?:

if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
  $.connection.hub.start()
}
Run Code Online (Sandbox Code Playgroud)

另请注意,当您创建连接时,它将处于"已断开连接"状态/ 4,直到调用它为止.一旦调用start,连接显然会尝试不断重新连接(如果它被中断),直到调用$ .connection.hub.stop()(然后将返回状态"已断开连接").

参考文献:

http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-javascript-client#establishconnection https://github.com/SignalR/SignalR/wiki


Lia*_*amB 5

您可以使用.done()检测集线器的启动时间

$.connection.hub.start().done(function () {
});
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以执行以下操作(取自文档: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!");
                 });
Run Code Online (Sandbox Code Playgroud)

  • 多?你可以解释吗? (2认同)
  • 完成多次被解雇你似乎有一个时间问题.你能创建一个repro项目吗? (2认同)

Owe*_*ing 5

您可以在每个功能中检查连接状态,例如:

function doSomething {
        if ($.connection.hub.state === $.signalR.connectionState.disconnected) {
            $.connection.hub.start().done(function () { myHub.server.myHubMethod(); });
        }
        else {
            myHub.server.myHubMethod();
        }
    }
Run Code Online (Sandbox Code Playgroud)