2013-08-22 16 views
0

我正在關注如何進行長輪詢的視頻教程,而且看起來我已經完成了,但由於某種原因,我遇到了一個問題,儘管我從服務器收到一個響應,但我的警報顯示了3-6倍。如果我們得到一個迴應,我認爲「成功」只會發生一次。JS - 長時間輪詢成功時多次獲取警報?

第二個問題是,我該如何讓這個javascript代碼每30秒取消一次ajax調用,然後重新啓動它?我在裏面放置了setInterval和.abort(),但是試驗時沒有運氣,可能是錯誤的放置。

謝謝你的智慧和幫助!

var timestamp = null; 
var imp = null; 
var annk = null; 
function waitForMsg(){ 
    $.ajax( 
    { 
     type: "GET", 
     url: "/test?timestamp=" + timestamp + "&imp=" +imp + "&annk=" +annk, 
     dataType : 'json', 
     async: true, 
     cache: false, 
     success: function(data) 
     { 
          alert("hello"); 
       if(data.annkr > "0"){ 
        $("#myidone").css("background-color", "#cccccc"); 
       }else{ 
        $("#myidone").css("background-color", "#cccccc"); 
       } 
       if(data.impr > 0){ 
        $("#myidtwo").css("background-color", "#000000"); 
       }else{ 
        $("#myidtwo").css("background-color", "#000000"); 
       } 
      annk = data.annkr; 
      imp = data.impr; 
      timestamp = data.timestamp; 
      setTimeout('waitForMsg()',2000);  
     } 
    }); 
} 

$(document).ready(function(){ 
    waitForMsg(); 
}); 

我讀了關於readystates的Stackoverflow上的內容,但是如何確保它只准備好一次,並在準備好之後執行?

回答

0

由於成功函數中的setTimeout(),您可能會多次看到警報,因此您一直在調用waitForMsg()函數。只是一個猜測。

要放棄,你可以做這樣的事情的要求:

var timer = null; 
function waitForMessage() { 
    var req = $.ajax(YOUR_CODE); 

    // The 30 second timeout 
    timer = setTimeout(function() { 
    req.abort(); 
    waitForMessage(); 
    }, 30000); 
} 

還是略勝一籌,也許:

function waitForMsg() { 
    $.ajax({ 
    timeout: 30000, 
    error: function(err) { 
     if(err === 'timeout') { 
     waitForMsg(); 
     } 
    } 
    }) 
} 
+0

謝謝,第二種方法是最好的,易於使用。現在工作正常。 – Darius

1

如果代碼恰好是您發佈的代碼,則沒有任何理由在重新計劃之後顯示超過1秒的提示,然後超過2秒。

你可以讓一個jsFiddle來顯示問題?

第二個問題更有意思。您可以使用.ajax調用中的timeout選項,然後在錯誤處理程序中重新調度該調用。

我個人的建議是重構你的代碼,使用基於.done.always的新jQuery Ajax風格。

而且setTimeout應該寫爲setTimeout(waitForMsg,2000)。使用字符串參數來評估該字符串,而不是僅僅調用該函數,這是一個性能損失(如此之小以至於很難察覺,但那是)。

+0

感謝您的提示,我將setTimeout更改爲您顯示的沒有撇號的方法。代碼和我發佈的完全一樣,但由於某種原因,今天早上我醒來了,它不再這樣做了。我現在正在研究.done,.fail和.always,我還沒有看到那些。謝謝。 – Darius

0

其實你應該使用的setInterval,而不是setTimeout的,如果你的AJAX調用使用這種方法失敗,你將強制中止循環。

您也可以取消或更改超時時間,具體取決於服務的使用情況,以確保網絡資源的完整性。