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

我正在开发一个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     
...

连接器看起来像这样:

 $.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'); }); 

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

  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.onerror的全局error handling程序( 另请参阅此SOpost ):

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

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

 connected = true; 

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

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