2016-08-14 51 views
3

我想用ajax調用一個控制器上的操作:10次,在我的MVC5應用程序中有2秒延遲。爲什麼不是用指定的延遲進行ajax調用

這裏是我寫的代碼:

$(document).ready(function() { 

    (function loop(i) { 
     setTimeout(function() { 
      var d = new Date(); 
      console.log(d.getTime()); 
      callAjax(); 
       console.log("works " + i); 
       if (--i) loop(i); 
      }, 
      2000); // ms 
    })(10); 

    function callAjax() { 
     $.ajax({ 
      url: '/Home/StartElection', 
      type: 'POST', 
      data: "test", 
      async: true 
     }) 
      .done(function (partialViewResult) { 
       $("#partialTable").html(partialViewResult); 
      }); 
    }; 
}); 

控制檯日誌是如預期(與延遲2秒),但到控制器上的電話瞬間發生 - 當我在設置斷點控制器上的Visual Studio在繼續操作之後動作下一次調用需要2ms

我看不出爲什麼會發生這種情況 - 任何人都可以幫忙嗎?

編輯:我加Date.getTime(的控制檯日誌)就在AJAX調用之前&有各自

+2

你如何檢查它? –

+0

我有一個被調用的動作斷點,只要我繼續它再次擊中斷點 – NRKirby

+0

我想你的觀察是錯誤的,由於ajax調用的異步性質。不要使用阻塞語句作爲斷點,請檢查您的網絡選項卡以查看請求發送。編輯:你的意思是斷點服務器端或客戶端? –

回答

0

之間2000毫秒你必須改變這條線單獨異步:真 - >異步:假 ,因爲如果此屬性設置爲true,則AJAX調用將會異步。 所以你的ajax調用沒有時間延遲。 希望這有助於。

0

就您的客戶端代碼而言,就通話而言,它似乎運作良好。這就是說,在處理ajax時需要考慮幾件事情:

1)您可以控制可以調用遠程服務的次數,但您無法控制該服務將花費的時間回覆。

2)因此,對於大多數情況來說,不要在循環中進行ajax調用通常是很好的做法(這有點挫敗了ajax的通用目的)。而是使用對每個調用的響應,然後進行下一次調用(但是當然,我們需要確切知道您正在嘗試構建什麼,以提供確切的解決方案)。

所以最接近你在找什麼用ajax我覺得會比較的是這樣的:

$(document).ready(function() { 

    /*(function loop(i) { 
     setTimeout(function() { 
      var d = new Date(); 
      console.log(d.getTime()); 
      callAjax(); 
       console.log("works " + i); 
       if (--i) loop(i); 
      }, 
      2000); // ms 
    })(10);*/ 

    var i=0; 
    function callAjax() { 
     var requestTimeMessage = "fetch #"+i+" at: "+new Date().getTime(); 
     console.log(requestMessage); 

     $.ajax({ 
      url: '/Home/StartElection', 
      type: 'POST', 
      data: "test", 
      async: true 
     }) 
      .done(function (partialViewResult) { 
       var requestTimeMessage = "response #"+i+" at: "+new Date().getTime(); 
       console.log(requestMessage); 

       $("#partialTable").html(partialViewResult); 
       i++; 
       if(i<10) { 
        /*Note this assumes a quick response for each call. 
        * Otherwise the response together with this delay will total a wait longer than 2 seconds. 
        */ 
        setTimeout(function() { 
         callAjax(); 
        2000); 
       } 
      }); 
    }; 
}); 

但正如我所說。我需要確切地知道你正在努力達到什麼樣的目的來給你的問題提供更合適的答案。