2014-01-10 17 views
-1

我有這樣的代碼:中止通話中「完整:」回調

$(function() { 
     (function poll(){ 
      var update_progress = setTimeout(function(){ 
        var jxhr = $.ajax({ 
         type: "POST", 
         url: "grab.php", 
         data: "test", 
         success: function(data){ 
          var error = data.error; 

          if(error == false) { 
           // My nonsense is here 
          } else if(error == true) { 
           // Stop sending AJAX request 
           clearTimeout(update_progress); 
           jxhr.abort(); 
          } 

         }, dataType: "json", complete: poll, timeout: 2000 }); 
      }, 2000); 
     })() 
    }); 

正如你可以看到我試着中止調用「完整:」再一次,如果我的腳本返回一個錯誤回調,而且我清楚超時。

基本上它不應該做任何ajax請求了。但它仍然如此。我錯了什麼?

+1

您無法中止已完成的請求。在這裏除了擁有一個全球性的國旗,你在成功上設置了錯誤,然後在錯誤的情況下完全放棄。 –

+0

這只是邏輯^^我只是想停止進一步的請求。 – Michael

+0

沒錯,但這就是邏輯。你必須取消使用某種標誌。 –

回答

0

我覺得這樣的事情可能工作:

$(function() { 
    (function poll(){ 
     var keepPolling = true; 
     var update_progress = setTimeout(function(){ 
       var jxhr = $.ajax({ 
        type: "POST", 
        url: "grab.php", 
        data: "test", 
        success: function(data){ 
         var error = data.error; 

         if(error == false) { 
          // My nonsense is here 
         } else if(error == true) { 
          // Stop sending AJAX request 
          keepPolling = false; 
         } 

        }, dataType: "json", complete: function() { 
         if (keepPolling) { 
          poll(); 
         } 
        }, timeout: 2000 }); 
     }, 2000); 
    })() 
}); 

基本上,有一個額外的變種,如果你想繼續輪詢跟蹤。將其默認爲true,並在出現錯誤時將其設置爲false。然後在完整的方法中,檢查是否要在實際再次調用輪詢之前繼續輪詢。

我不確定是先完成還是成功。如果完成被首先調用,那麼這將不起作用(儘管您可能會在傳遞給setTimeout的函數頂部添加keepPolling檢查)。

+0

非常感謝。也作解釋。我對javascript/jquery很新,所以這對我很有幫助。謝謝! – Michael

1

從文檔:

complete - A function to be called when the request finishes (after success and 
error callbacks are executed). 

因此,無論你在success處理程序做poll()總是被調用。最簡單的解決辦法是

if(error == false) { 
    ... 
    poll(); 
} 
else { 
    //don't poll ;) and forget clearTimeout and abort as it's useless 

更多的事情:我的情況下錯誤的腳本應該返回正確的HTTP狀態代碼(一些4XX或者5XX)。然後,您可以將錯誤處理代碼放入正確的error處理程序中,而不是success處理程序。