【问题标题】:Signalr check if hub already startedSignalr 检查集线器是否已经启动
【发布时间】:2013-02-10 13:55:42
【问题描述】:

我有多个带有 signalR 函数的 javascript 块。

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

$.connection.hub.start();

如果它还没有开始。

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

【问题讨论】:

    标签: javascript signalr


    【解决方案1】:

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

    $.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 ,连接显然会不断尝试重新连接(如果它被中断),直到调用 $.connection.hub.stop() (然后将返回状态“断开连接”)。

    参考:

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

    【讨论】:

      【解决方案2】:

      您可以检查每个函数中的连接状态,例如:

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

      【讨论】:

      • 这不是很好,因为状态可能是“正在连接”,你会触发另一个启动,这会崩溃。最好做 dpb 之类的。在尝试连接之前检查它是否已断开连接。
      【解决方案3】:

      您可以使用 .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!");
                       });
      

      【讨论】:

      • 多个?你能解释一下吗?
      • 我有多个来自不同服务器生成的部分 html 页面的 javascript 块。我不知道脚本块执行的顺序。所以我不知道从哪里开始我的中心。
      • 抱歉,您还没有回答问题。我想你不明白这个问题。您的答案不检查集线器是否已启动,但仅在集线器启动时执行 .done() 。这会有所不同。
      • 我有一个布局/母版页,我可以在其中启动我的集线器。然后在我的部分页面中,我在该集线器上调用不同的信号器函数。对我来说,这听起来不像是设计问题。
      • Done 确实被解雇了多次,您似乎只是有时间问题。你能创建一个repro项目吗
      猜你喜欢
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2019-11-12
      • 2012-02-17
      • 2013-12-06
      • 1970-01-01
      相关资源
      最近更新 更多