2011-09-26 68 views
1

我已經看過一堆這些線程,並經歷了其中的一些,但目前爲止似乎沒有任何幫助。所以我試圖在ajax調用發生時連續調用定時器。一旦ajax調用達到完整的事件,我想清除間隔定時器,但這似乎並沒有工作,因爲對CheckProgress()的調用持續進行。還有一個javascript clearInterval不起作用

這裏是我的代碼:

var timer = ""; 

     $("#ChartUpdateData").click(function() { 
      $("#loadingimgfeatdiv").show(); //ajax loading gif 
      if (timer == "") 
      { 
       console.log("Starting Progress Checks..."); 
       timer = window.setInterval("CheckProgress()", 5000); 
      } 

      $.ajax({ 
       type: "POST", 
       async: true, 
       url: '@(Url.Action("UpdateServerData","Charts"))', 
       contentType: "application/json; charset=utf-8", 
       success: function (data) { 

       }, 
       error: function (XMLHttpRequest, textStatus, errorThrown) { 

       }, 
       complete:function (jqXHR, textStatus) { 
        $("#loadingimgfeatdiv").hide(); 
        StopCheckingProgress(); 
        LoadChart(); 
       }, 
      }); 

     }); 

    function StopCheckingProgress() 
    { 
     window.clearInterval(timer); 
     timer = ""; 
     console.log("Ending Progress Checks..."); 
    } 
    function CheckProgress() 
    { 
     console.log("Checking Progress..."); 
     console.log(timer); 
    } 

編輯: enter image description here

+0

你確定你的'complete'函數是否被調用過?這可能只是您的AJAX請求的一個問題,而與'setInterval()'無關。 – nrabinowitz

+0

100%肯定它的工作。我可以看到console.log(「結束進度檢查...」);正在處理中。我添加了一個螢火蟲的圖像,以幫助顯示正在發生的事情。 – Robodude

+1

我覺得你太過於複雜了。爲什麼您首先需要這些定時器,何時您可以使用$ .ajax提供的事件處理所有事情? – topek

回答

4

我從來不喜歡setInterval。我喜歡直接管理定時器。

var timerStop = false 

$("#ChartUpdateData").click(function() { 
    $("#loadingimgfeatdiv").show(); //ajax loading gif 
    if (!timerStop) { 
     console.log("Starting Progress Checks..."); 
     CheckProgress() 
    } 

    $.ajax({ 
     type: "POST", 
     async: true, 
     url: '@(Url.Action("UpdateServerData","Charts"))', 
     contentType: "application/json; charset=utf-8", 
     success: function (data) { 

     }, 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 

     }, 
     complete:function (jqXHR, textStatus) { 
      $("#loadingimgfeatdiv").hide(); 
      timerStop = true; 
     }, 
    }); 

}); 

function CheckProgress() { 
    if(timerStop) { 
     console.log("Ending Progress Checks..."); 
     return; 
    } 
    console.log("Checking Progress..."); 
    console.log(timer); 
    window.setTimeout(function(){CheckProgress()}, 5000); 
} 
+1

至少使用'window.setTimeout(CheckProgress,5000);'因爲我們都在這裏明白和喜歡這裏 – mplungjan

+0

這個很好用!但是我仍然想知道爲什麼setInterval不能正常工作。如果沒有其他信息發佈,我會在幾個小時內接受此信息。 – Robodude

+0

這是我第二次陷入'setInterval()'陷阱。謝謝!! –

1

你的代碼是正確的。這是一個fiddle。它可以像您預期的那樣在Google Chrome和Firefox上運行。你能確認這段代碼在你的機器上不起作用嗎?

我做了一些微小的變化:

  • AJAX調用/echo/json
  • 較小的間隔(50毫秒)
  • 功能參考:setInterval(CheckProgress, 5000),而不是字符串用JavaScript

間隔功能稱爲幾次,並且被清除一次echo服務AJAX調用返回。你究竟希望如何。

您可以在那裏重現問題嗎?

+0

不,我不能在那個jsfiddle中重現問題。它的工作原理如我所料:(你認爲我在MVC3應用程序中工作的事實與它爲什麼不工作有關? – Robodude