2013-08-25 166 views
0

對於我的程序,我必須提出100個JSON請求。不幸的是,每秒只允許5個呼叫。由於我使用for循環完成所有JSON請求(是最好的方法),因此我必須在每5次調用1秒後暫停循環。每五次迭代後暫停一次循環

function Hello() { 
    $("#randomdiv").show(); 
    for (var i=0; i<100; i++) { 
     if (i%5 == 0 && i>0) { 
     sleep(1000); 
     } 
     $.getJSON(JSONreq, function(data) {Just a JSON request, nothing special}) 
    }; 
}; 

sleep(1000)導致整個頁面凍結了約20秒,並防止#randomdiv從由JSON的請求之前出現。

我能做些什麼來解決這個問題? 非常感謝:)

+0

使用計時器:HTTP://www.w3schools .com/js/js_timing.asp – Alfie

+0

@Alfie我無法弄清楚如何僅使用計時器每五次迭代。這兩個計時器哪一個對我更好? – user2498308

+0

您可能會希望'setInterval()',因爲它會繼續循環,直到您停止它爲止。如果你想每五次執行一次代碼,你可以使用一個全局變量整數,每次循環增加1,然後檢查它是否爲== 4,如果它是 - 執行你的代碼並將數字重置爲0,否則,只需在數字中加1並退出函數 – Alfie

回答

0

您可以使用超時與閉合:

function Hello() { 
    $("#randomdiv").show(); 
    var loop = getLoop(); 
    loop(); 
}; 

function getLoop() { 
    var count = 0; 
    var func = function() { 
     for (var i = 0; i < 5; ++i) { 
      $.getJSON(JSONreq, function(data) {Just a JSON request, nothing special}) 
     } 
     if (++count < 20) { 
      setTimeout(func, 1000); 
     } 
    } 
    return func; 
} 
-1

你可以做這樣的事情:

function Hello() { 
    $("#randomdiv").show(); 
    for (var i = 0; i < 100; i++) { 
     var interval = 0; 
     if (i % 5 == 0 && i > 0) { 
      interval = 1000; 
     } 
     setTimeout(function() { 
      getJson() 
     }, interval); 
    }; 
} 

function getJson() { 
    $.getJSON(JSONreq, function (data) { 
     Just a JSON request, nothing special 
    }); 
} 
+0

不'setTimeout'使該函數異步運行?所以如果你運行這個,我認爲它會首先通過'for'循環100次並設置超時,然後一秒鐘後它們將全部同時運行。假設延遲'0'運行'setTimeout'不會執行任何操作,這可能不是這種情況。你可能會發現它立即執行80次getJson(),然後在一秒鐘後執行20次。 –