如何防止signalR错误停止进一步执行javascript

时间:2014-02-18 09:36:20

标签: javascript jquery asp.net asp.net-mvc signalr

我正在开发一个asp.net mvc项目,我们使用SignalR在不同视图中实时连接。除了如果SignalR出现问题,javascript的执行停止这一事实外,效果很好。通常,如果我的自托管应用程序出现故障或发生其他连接问题,则此错误将成为问题。

GET http://localhost:8081/signalr/hubs net::ERR_CONNECTION_REFUSED List:328
Uncaught TypeError: Cannot read property 'client' of null 

如上所述,如果发生这种情况,它会阻止我的所有其他javascript执行,从而无法正确呈现我的视图或布局。有没有办法解决这个问题,所以视图继续加载并运行其javascript?

我的典型观点如下:

@model Services.Models.SomeModel
<script src="~/Scripts/jquery.signalR-2.0.2.js"></script>
<script src="http://localhost:8081/signalr/hubs"></script>
<script src="~/Scripts/signalR.connector.js"></script>
<script src="~/Scripts/signalR.fleet.js"></script>
<div id="page-content">
    ...
</div>

连接器如下所示:

$.connection.hub.url = "http://localhost:8081/signalr";

//Enable logging
$.connection.hub.logging = true;

// Proxy created on the fly
var messageHub = $.connection.myHub;
if (messageHub == null)
    return null;

messageHub.client.timeEnabled = true;

... ommitted functions ...


$.connection.hub.start(function () {
        var id = $('#signalRId').text();
        messageHub.server.joinGroup("operationStatus-" + id);
        console.log("Joined group: operationStatus-" + $('#signalRId').text());
}).done(function () {
        console.log('Now connected, connection ID=' + $.connection.hub.id); 
        }
).fail(function () { console.log('Could not Connect'); });

2 个答案:

答案 0 :(得分:1)

我也有这个问题。一种简单的方法是在完成的回调中设置一个布尔值。

connected = true;

然后在每次请求之前检查。

我给我写了一个免费提供我所有SignalR内容的lib,并给我成功和错误回调。在这种情况下,我会得到一个内容为“未连接”或其他内容的errorCallback。使用lib,你只需要编写一次。

答案 1 :(得分:1)

不完全确定你要求的是什么,但这是我的想法 - 你的基本工具是......

  1. 检查有问题的情况

    if (messageHub) { 
        // set up client hub methods and start connection ...   
    } else {
        // /signalr/hubs script didn't load properly, so skip setting up signalr
    }
    
  2. 使用try / catch(对于可能导致问题但不太可预测的事情);阅读jquery.signalR-*以查看SignalR代码可能引发的错误

  3. 使用window.onerroralso see this SO post)的全局错误处理程序:

    window.onerror = function(message, url, lineNumber) {
       console.log(message);
    };