我的应用程序经常会在糟糕的公司网络(代理、防火墙等)下使用,所以我不能依赖套接字,长轮询实际上是我唯一的选择。这是长轮询的最大问题:
- 长轮询在某个时间点断开连接
- 我自动重新连接(根据文档)
- 用户单击导致集线器方法调用的内容,但尚未建立连接 - 发生错误。
有没有办法同步集线器方法调用和重新连接,例如:
- 我调用集线器方法
- SignalR 发现连接尚未准备好
- 它会等到连接准备好并调用集线器方法
目前我还没有看到这样的机会,似乎我唯一的选择就是切换到 ajax 调用,这很遗憾。
我是如何处理的:
-
have a isConnected boolean
在我的客户端上,以便每当我连接时,我将其设置为true
,每当我断开连接时,我都会将其设置回false
:
$.connection.hub.start().fail((err) => { alert(err); }).done(() => this.isConnected = true);
$.connection.hub.disconnected(() => { this.isConnected = false; });
$.connection.hub.reconnected(() => { this.isConnected = true; });
-
现在,在调用集线器方法之前,我检查是否isConnected
是真的。如果没有,我尝试启动集线器连接:
$("#serverButton").click(function(){
if(this.isConnected==false)
$.connection.hub.start();
$.connection.hub.server.serverMethod();
})
这就是我现在处理此类情况的方式。
希望这可以帮助。祝你好运!
更新:实际上存在一个属性$.connection.hub
called state
您可以在连接期间的每个点进行访问。
因此,您可以通过检查来跳过拥有自己的变量的步骤(尽管我仍然使用它只是为了确定)$.connection.hub.state
.
$.connection.connectionState
Object {connecting: 0, connected: 1, reconnecting: 2, disconnected: 4}
输出来自$.connection.hub.state
是上面的整数,但你可以这样做:$.connection.hub.state == $.signalR.connectionState.connected
你可以有布尔值。
更简单,但每次调用集线器方法时仍然需要检查这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)