【问题标题】:SignalR - Establishing Connection Taking quite a long timeSignalR - 建立连接需要很长时间
【发布时间】:2013-12-03 21:35:58
【问题描述】:

我刚刚开始使用 SignalR 进行实时更新。建立连接后我需要执行一些操作。所以我在 .done() 方法中编写了该代码。

我面临的问题是:建立连接需要一些时间,因此我无法执行我打算执行的操作。以下是我的js的代码sn-p。

   $(function () {
   // Proxy created on the fly  
    projectHub = $.connection.projectHub;
    $.connection.hub.logging = true;
    // Start the connection
    $.connection.hub.start().done(function () {
    $("#lnkFollowProject").live("click", function () {
        console.log("Follow click");
        projectHub.server.followProject(projectId, currentLoggedInUserId);
     });
     $(".lnkUnfollowProject").live("click", function () {
        console.log("Unfollow click");
        projectHub.server.unfollowProject(projectId, currentLoggedInUserId);
      });     });     });

我不确定为什么建立连接需要时间。当我尝试使用简单的聊天应用程序时,它运行良好。我正在为该页面执行许多其他功能,并且还使用敲除进行绑定。 (不适用于上述功能)。我也搜索过这个,发现杀毒软件可能是受害者。我也尝试禁用它,但没有任何收获。

我知道一种解决方案,我可以禁用按钮直到建立连接并在完成后启用它。但我不希望用户限制。

如果有任何其他可能的问题,请通知我。

提前致谢。

【问题讨论】:

    标签: asp.net-mvc signalr signalr.client


    【解决方案1】:

    我有两个关于代码性能的建议。

    1) 使用 .on() 方法代替 .live()

    不再推荐使用 .live() 方法,因为 jQuery 的更高版本提供了 .delegate 和 .on 方法。 使用 .live() 会出现以下问题:

    I) jQuery 在调用 .live() 方法之前尝试检索选择器指定的元素,这在大型文档上可能会很耗时。

    II) 由于所有 .live() 事件都附加在文档元素上,因此事件在处理之前会采用最长和最慢的路径。

    2) 将点击事件从.done()方法中去掉,因为“followProject”和“unfollowProject”方法都需要先点击事件才能触发自己。

    见以下代码:

    $(function () {
                // Proxy created on the fly  
                projectHub = $.connection.projectHub;
                $.connection.hub.logging = true;
                // Start the connection
                $.connection.hub.start();
    
                $(document.body).on("click","#lnkFollowProject", function () {
                   console.log("Follow click");
                   projectHub.server.followProject(projectId, currentLoggedInUserId);
               });
               $(document.body).on("click",".lnkUnfollowProject", function () {    
                   console.log("Unfollow click");
                   projectHub.server.unfollowProject(projectId, currentLoggedInUserId);
               });       
            });
    

    【讨论】:

    • 最初只是这样。但问题是如果点击关注/取消关注 - 我们正在使用需要建立连接的 Hub 方法调用。因此,如果未建立连接,则会给出错误消息“SignalR:连接尚未完全初始化。”
    • 我发现的可能原因是,我们正在为此页面加载许多 JS 和 css 文件。当我们删除它们时,连接会在几毫秒内建立。但是我们不能避免那些 JS 和 css 文件。
    • 很高兴您发现了问题。我不确定你首先说的是什么,看起来最好将持久连接用于集线器。要解决加载很多 JS 和 CSS 文件,我能想到的唯一方法就是使用缩小。
    • 我想从我的第一条评论中说,我最初的实现方式与您提供的代码相同。但是,如果我们在建立连接之前订阅点击;在这种情况下,如果有人单击按钮,他们将在控制台中收到错误消息“SignalR:连接尚未完全初始化”。在那个点击中我们调用 HUB 方法并且连接仍然没有建立。
    • 我还没有找到解决办法。它只是我尝试删除所有JS并尝试建立它并且它有效。我可以尝试缩小它们。让我们看看它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多