我有一个小项目,SignalR的工作,但我得到了一些非常不一致的行为。
<script type="text/javascript">
$(function () {
var chat = $.connection.brewBattleHub;
$.connection.hub.start().done(function () {
$("#broadcast").click(function () {
// Call the chat method on the server
chat.server.roll($("#username").val(), $("#drinkname").val());
});
chat.server.sendMessage("SignalR loaded...");
});
});
</script>
当网页加载完毕后,有时我看到消息“SignalR装”,其他时间我不是。
还有是在页面上一些其他的功能还,有时这也不管用。 如果我点击按钮,使事情发生足够它最终将所有一气呵成来通过......从这个角度它是所有黄金和完美的作品。
不start().done()
? 不能保证它是都准备好了吗?
===编,我没有引用jQuery Mobile的(谷歌提到有这样做当一个bug)
这周我也有类似的问题,只是在.done()的代码绝然。 我启用了日志记录,没有什么是永远记录下来。 检查浏览器的控制台没有错误。 展望在浏览器的开发者工具,我可以看到,有没有网络活动时,我调用start()。 我确认,$ .connection.myhubclass返回的代理有我就可以了所有的方法,所以我知道它可能跟我们的服务器和服务器端代码中树立正确的。
审查代码和文档一遍又一遍后,我确信我没有做错什么。 SignalR是如此简单,它是非常艰难做是错误的,如果你遵循的例子。 我打我的办公桌上头相当长的时间试图弄清楚这一点。
后来我发现,如果我从控制台运行SignalR的启动方法,它会工作。 这使我相信,这是试图太早开始连接。 我解决了我的问题,通过改变从这个初始化代码:
$.connection.hub.start().done(function () {
//Do interesting stuff
});
为此:
setTimeout(function () {
$.connection.hub.start().done(function () {
//Do interesting stuff
});
}, 5000);
我敢肯定,我可以从5秒减少延迟的东西短,但额外的时间似乎是被需要的,让浏览器中得到自己准备创建的连接。 一旦延迟是有记录开始工作,连接上来后,服务器端OnConnected()跑,做()是在客户机上运行。
搞清楚了这一点后,我仔细检查了我的javascript的加载顺序,想也许我是装出来的东西顺序,但顺序是正确的根据SignalR样品。 我加载了jQuery,SignalR,/ signalr /集线器,然后我的脚本初始化一切文件。
我以为什么需要该延迟开放的建议。 我没有看到它在任何文档,所以我知道这可能是我做的事。 幸运的是这个页面启动SignalR前一个小的延迟是没有问题的。
尝试启用SignalR日志记录,以帮助调试您的问题。 您可能还需要增加一个fail
的情况下,启动处理程序没有成功(尽管这种可能性不大)。 一旦你做到了这一点,你可以看看,通过浏览器的F12工具来看看JS和网络日志。
<script type="text/javascript">
$(function () {
$.connection.hub.logging = true;
var chat = $.connection.brewBattleHub;
$.connection.hub.start().done(function () {
$("#broadcast").click(function () {
// Call the chat method on the server
chat.server.roll($("#username").val(), $("#drinkname").val());
});
chat.server.sendMessage("SignalR loaded...");
}).fail(function (reason) {
console.log("SignalR connection failed: " + reason);
});
});
</script>
我已经找到了解决方案(就我的问题)。 我有SignalR负荷对IE11大约7-8秒,我在控制台试图“调试”这一点,我已经找到了加载延迟的原因:
[13时13分04秒GMT + 0200(...)] SignalR:绑定到iframe的load事件。
[13时13分09秒GMT + 0200(...)] SignalR:foreverFrame尝试连接时超时。
[13时13分09秒GMT + 0200(...)] SignalR:停止永远帧。
花了5秒。 尝试加载iframe中。
的纯溶液是把iframe中断,作为IE11可以正常使用longPolling:
$.connection.hub.start(({ transport: ['webSockets', 'serverSentEvents', 'longPolling'] }))
我有一个类似的问题,只有试图重新建立后断开连接时出现。 我调用start()从断开处理程序,然后试图从start.done发送消息()。 然后,我得到了一个错误消息SignalR还没有准备好。
我在日志中发现start.done()所以在我的情况下,从断开一个电话开始,然后发送立即解决。 我在断开连接处理程序添加一个setTimeout的,这样启动发送从断开进行分离。 这解决了这个问题对我来说。