2011-11-29 72 views
15

有什麼辦法停止在SignalR中的輪詢服務器?如果發生錯誤,我想停止輪詢服務器。輪詢中心開始於$.connection.hub.start(),所以我認爲它可以停止$.connection.hub.stop()或類似的東西。但它似乎並不奏效,即使撥打stop()後,投票仍然繼續。有沒有另一種方法來停止查詢?如何在SignalR中停止輪詢?

<script type="text/javascript"> 

var chatHub = $.connection.chatHub; 
var connection = $.connection.hub; 

chatHub.addMessage = function (message) { 
     $('#messages').append('<li>' + message + '</li>'); 
    }; 

connection.error(function (error) { 
$('#messages').append('<li>' + "error connecting: closing connnection" + '</li>'); 
    connection.stop(); //This doesn't seem to work 
     }); 

connection.start(); 

</script> 

回答

37

如果您正在使用集線器,您可以停止集線器的連接:

$.connection.hub.stop(); 
+0

將該語法更改爲$ .connection.hub.connection.stop( )?這對我來說很有用。 – dove

+0

不,它沒有。這並沒有改變 – davidfowl

+0

顯然我混在一起,很抱歉浪費你的時間,現在是時候閱讀關於停止特定集線器上的連接$ .connection.myHub.stop()和以上之間的區別。有一個想法,但我認爲我會設置一個沙箱,所以我知道。 – dove

2

首先確定是否有必要?如果發生通信錯誤顯然你想重試它。

但是,我查看了源代碼,我的意思是說,特別是在錯誤處理程序中,不可能調用.stop()命令。分別它沒有效果,因爲處理函數完成後比通信自動重新初始化兩秒後。

見jquery.signalR.js(線340):

$(instance).trigger("onError", [data]); 

window.setTimeout(function() { 
    poll(instance); 
}, 2 * 1000); 

我發現一個解決方法:在處理程序函數拋出異常,這會導致輪詢沒有被重新初始化:

connection.error(function (error) { //$.connection.hub.error() 
    $('#messages').append('<li>' + "error connecting: closing connnection" + '</li>'); 
    throw "Close SignalR connection"; 
});