2012-01-13 106 views
0

我正在基於長時間輪詢(類似於this)與PHP和jQuery進行聊天。一旦整個頁面被下載到瀏覽器中,一個函數會對後端發出長時間輪詢請求,並有一些超時限制,當數據來自後端時,它會再次發出長輪詢請求,如果有任何錯誤,它將再次創建新的長輪詢請求。jquery php長輪詢請求問題

問題:通過螢火蟲分析跟蹤,我注意到有些時候長輪詢請求運行了3次或4次,但它不應該。每個頁面只應運行一個長輪詢請求。

但是代碼完美地工作。但長輪詢請求重複是問題。

function listen_for_message(){ 
// this functions is makes the long-polling request 
$.ajax({ 
    url: "listen.php", 
    timeout:5000, 
    success: function(data) { 
      $('#display').html(data); 
      listen_for_message(); 
      } 
    error: function() { 
      setTimeOut("listen_for_message()",2000); // if error then call the function after 2 sec 
    } 
    }); 
    return; 
} 
+2

請你可以發佈你的代碼,啓動長輪詢? – jabclab 2012-01-13 10:50:33

+0

編輯了包含在其中的代碼。 – 2012-01-13 10:59:06

回答

1

嘗試terminate requests manualy

var connection; 
function longpoll() { 
    if(connection != undefined) { 
     connection.abort(); 
    } 

    connection = $.ajax({ 
     ... 
     complete: function() { 
      longpool(); 
     } 
    }); 
} 

它也可以是一個Firefox /螢火問題(表示中止連接跑步),在瀏覽器對其進行測試。

UPDATE:

「在Firefox 3.0+只,腳本和JSONP請求不能被一個超時被取消;如果超時時間到達後腳本也會繼續運行。」 http://api.jquery.com/jQuery.ajax/

+0

好的建議讓我檢查鉻 – 2012-01-13 11:07:44

+0

有沒有辦法在代碼中做這樣的代碼將檢查,如果有運行一個請求然後函數將返回其他函數將調用? – 2012-01-13 11:10:12

+0

您可以使用_connection_變量作爲標誌來檢查是否有任何ajax請求正在運行,如果不是,則不允許創建新的。如果連接!=未定義,只需在'long'函數的開始處設置'connection = undefined;'在'complete'函數和'return'中。 – 2012-01-13 11:18:17