我有一个与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 loaded”,有时我不是。
页面上还有一些其他功能,有时这也不起作用。如果我点击按钮并让事情发生得足够的话,它最终会一次性完成......从这一点来说,这一切都是金色的,并且完美无瑕。
是start().done()
吗?不确保它已准备就绪?
=== 附录,我没有引用jquery mobile(谷歌提到这样做时有一个错误)
答案 0 :(得分:11)
本周我遇到了类似的问题,但.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()运行并且在客户端上运行了done()。
在搞清楚之后,我仔细检查了我的javascript加载的顺序,想到也许我正在加载无序的东西,但顺序是根据SignalR样本的顺序。我加载了jQuery,SignalR,/ signalr / hubs,然后加载了初始化所有内容的脚本文件。
我愿意接受为何需要延迟的建议。我没有在任何文档中看到它所以我知道它可能是我做的事情。幸运的是,对于这个页面,启动SignalR之前的一个小延迟不是问题。
答案 1 :(得分:9)
尝试启用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>
答案 2 :(得分:3)
我找到了一个解决方案(就我的问题而言)。 我在IE11上将SignalR加载了大约7-8秒,我试图在控制台中“调试”它并且我找到了加载延迟的原因:
[13:13:04 GMT + 0200(...)] SignalR:绑定到iframe的加载事件。
[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'] }))