2015-02-24 84 views
0

我相信我通過使在短時間內過多調用超時web服務之間。我想在我的jQuery中的$.each循環的每次迭代之間等待大約5秒鐘。

這裏來看看我有什麼:

function submitMyList(myList) { 
    $.each(JSON.parse(myList), function (key, value) { 
     setTimeout(function(){ 
      $.ajax({ 
       type: 'POST', 
       url: '@Url.Action("submitMyList", "myController")', 
       dataType: 'html', 
       contentType: 'application/json; charset=utf-8', 
       data: JSON.stringify(//passing my values), 
       success: function (result) { 
        //success code 
       }, 
       error: function (result) { 
        //error code 
       }, 
       complete: function() { 
        //completion code 
       } 

      }); 
     }, 5000)  
    }); 
} 

這仍然是執行非常快,此起彼伏。

+0

而不是試圖提出同樣的要求每五秒鐘,等到前請求作出在下單前完成。 – zzzzBov 2015-02-24 15:03:25

+0

@zzzzBov我不是真的想要這樣做。每個請求可能需要大約1-2分鐘才能完成。我的名單可能會有70個參賽作品。因此執行提交可能需要很長時間。 – Johnrad 2015-02-24 15:16:39

回答

2

發生什麼事情是,當你運行你的「每個」,你立即設置了很多定時器,其中所有等待5秒鐘,然後同時運行。 這是因爲每個人都希望儘快完成循環,並且它運行了所有的功能(包括「setTimeout」功能)。它不需要等待任何東西,所以運行並設置一個lotta'超時:)

最簡單的解決方案是讓setTimeout等待5000 * num毫秒並增加每個循環的數量,如下所示:

function submitMyList(myList) { 
    var num = 0; 
    $.each(JSON.parse(myList), function (key, value) { 
    num++; 
    setTimeout(function(){ 
     $.ajax({ 
      type: 'POST', 
      url: '@Url.Action("submitMyList", "myController")', 
      dataType: 'html', 
      contentType: 'application/json; charset=utf-8', 
      data: JSON.stringify(//passing my values), 
      success: function (result) { 
       //success code 
      }, 
      error: function (result) { 
       //error code 
      }, 
      complete: function() { 
       //completion code 
      } 

     }); 
    }, 5000*num);  
    }); 
} 
+0

它應該工作,看看這的jsfiddle最小測試:http://jsfiddle.net/cy0uqLnj/ 要添加到我的答案,這將是更好的使用「成功」來設置一個新的計時器,優勢如果通話延遲,你是否沒有「堆積」通話的風險?如果請求失敗,缺點是一切都會停止。 – 2015-02-24 15:09:45

+0

我很抱歉,這工作,我讓自己有點轉身。至於它爲什麼起作用,我仍然有點困惑。第一句中的工作對我來說有點困惑。 – Johnrad 2015-02-24 15:18:20

+0

沒問題,開心工作。有一點澄清了我的答案,希望它有所幫助。 – 2015-02-24 15:25:39

1

這種做法會工作:

$(document).ready(function() { 
    var a = new Array("Apples", "Bananas", "Oranges") 
    jQuery.each(a, function (idx, val) { 
     setTimeout(function() { 
      console.log("At "+idx+" Val "+val) 
     }, idx * 5000); 
    }) 
}) 

在特定情況下,嘗試這樣的:

function submitMyList(myList) { 
    var idx = 0; 
    $.each(JSON.parse(myList), function (key, value) { 
     setTimeout(function(){ 
      $.ajax({ 
       type: 'POST', 
       url: '@Url.Action("submitMyList", "myController")', 
       dataType: 'html', 
       contentType: 'application/json; charset=utf-8', 
       data: JSON.stringify(//passing my values), 
       success: function (result) { 
        //success code 
       }, 
       error: function (result) { 
        //error code 
       }, 
       complete: function() { 
        //completion code 
       } 

      }); 

     }, idx*5000) 
     idx++;  
    }); 
}; 

例如這裏:http://jsfiddle.net/1w6uxLxs/1/

想法 你必須迭代的次數乘以你超時,因爲正在發生的事情是,超時設置一個接一個(基本上同時),因爲什麼情況是,該循環遍歷所有元素,並指導瀏覽器(setTimeout)在一段時間後執行一個函數。通過將這段時間乘以索引,您將獲得「延遲」效果。看一看在控制檯在這個例子中會發生什麼:http://jsfiddle.net/1w6uxLxs/2/

+0

感謝您的幫助,這確實像魅力一樣工作。你介意解釋爲什麼每次循環迭代時我必須乘以'idx'? – Johnrad 2015-02-24 15:08:54

+0

我更新了答案,試圖解釋這個想法。如果清楚,請告訴我。 – Danilo 2015-02-24 15:28:01