SignalR并不总是准备在开始后()。()完成?(SignalR not always ready

2019-08-17 09:32发布

我有一个小项目,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)

Answer 1:

这周我也有类似的问题,只是在.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前一个小的延迟是没有问题的。



Answer 2:

尝试启用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>


Answer 3:

我已经找到了解决方案(就我的问题)。 我有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'] }))


Answer 4:

我有一个类似的问题,只有试图重新建立后断开连接时出现。 我调用start()从断开处理程序,然后试图从start.done发送消息()。 然后,我得到了一个错误消息SignalR还没有准备好。

我在日志中发现start.done()所以在我的情况下,从断开一个电话开始,然后发送立即解决。 我在断开连接处理程序添加一个setTimeout的,这样启动发送从断开进行分离。 这解决了这个问题对我来说。



文章来源: SignalR not always ready after start().done()?