2012-02-01 65 views
7

我想在每個迭代的下一個循環中添加1-2秒的延遲。如何減慢JavaScript循環

<html> 
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 

<input id="start" type="submit"> </input> 
<div id='status'></div> 

<script> 
var geocoder=new google.maps.Geocoder();     
var glGeocodeCount = 0 ; 

$(document).ready(function() { 

    $('#start').click(function() { 

     //srPerformGeocode("TD Tower, 55 King Street West, Toronto, ON, Canada, M5K 1A2");  

     for(x=0;x<20;x++){ 
      srPerformGeocode("TD Tower, 55 King Street West, Toronto, ON, Canada, M5K 1A2"); 
     } 
     return false; 
    });   
}); 

function srPerformGeocode(address){  
    if (geocoder){     
     geocoder.geocode({ 'address': address }, function (results, status) {                    
      if (status == google.maps.GeocoderStatus.OK){                                           
       $('#status').prepend("Success : " + address + "<br/>"); 

      } 
      else{ 
       $('#status').prepend("Failed : " + address + "<br/>"); 

      } 
     }); 
    } 
} 
</script> 
+0

你爲什麼要對同一個地址進行20次地理編碼?以 – ceejayoz 2012-02-01 04:24:42

+0

爲例。我注意到一些API的供應商(例如谷歌)不喜歡你在他們的大門上喋喋不休。我想通過使用計時器來減少呼叫的頻率,但是在循環中使用它時遇到了問題, – 2012-02-01 04:29:29

+0

這是真的,但是爲什麼每次都會用相同的請求在門口敲打? – ceejayoz 2012-02-01 04:45:46

回答

11

你可以做這種方式與setTimeout()

$(document).ready(function() { 
    $('#start').click(function() { 
     //srPerformGeocode("TD Tower, 55 King Street West, Toronto, ON, Canada, M5K 1A2");  
     var x = 0; 

     function go() { 
      srPerformGeocode("TD Tower, 55 King Street West, Toronto, ON, Canada, M5K 1A2"); 
      if (x++ < 20) { 
       setTimeout(go, 2000); 
      } 
     } 
     go(); 

     return false; 
    });   
}); 

這確實讓我不知道爲什麼你在完全相同的地址連續做了地理代碼查找20倍?

+0

先生朋友 - 請參閱上面 – 2015-05-15 03:27:50

4

您可能想爲此使用計時器。如果你只是在代碼中加入一個延遲循環,結果只會是代碼運行時間較長,但最終結果會在代碼完成後立即顯示出來。

您可以使用setTimeout或setInterval方法。例如:

function(){ 

var instructions = [ 
function() { /* do something */ }, 
function() { /* do something */ }, 
function() { /* do something */ }, 
function() { /* do something */ } 
]; 

var index = 0; 

var handle = window.setInterval(function() { 
if (index < instructions.length) { 
    instructions[index++](); 
} else { 
    window.clearInterval(handle); 
} 
}, 10); 

}(); 
0

我鼓勵擺脫循環使用的setTimeout:

$('#start').click(function() { 
     var i = 0, max = 20, delay = 2000, run; 
     run = function(){ 
      srPerformGeocode("TD Tower, 55 King Street West, Toronto, ON, Canada, M5K 1A2"); 
      if(i++ < max){ 
       setTimeout(run, delay); 
      } 
     } 
     run(); 
     return false; 
    }); 
0

我有一種感覺,你寧可不要開始下一個循環迭代,直到地理代碼查找是真正完成。所以,關鍵字有「回調」:

而不是for...,請執行以下操作。我知道這可能不是你習慣的東西,但是請嘗試去理解它(它應該是有效的)。

var dogeo = function(callback) 
{ 
    srPerformGeocode("address", callback); 
}; 

var counter = 0; 

var geoCallback = function() 
{ 
     counter++; 

     if(counter < 20) 
     { 
      dogeo(geoCallback); 
     } 

}; 


dogeo(geoCallback); 



function srPerformGeocode(address, callback){  
    if (geocoder){     
     geocoder.geocode({ 'address': address }, function (results, status) {  


      // this function is a callback of geocode() 

      if (status == google.maps.GeocoderStatus.OK){                                           
       $('#status').prepend("Success : " + address + "<br/>"); 

      } 
      else{ 
       $('#status').prepend("Failed : " + address + "<br/>"); 

      } 

      callback(); // let the caller know this is done 
     }); 
    } 
} 
+1

使用setTimeout/setInterval暫停可能適用於您,但這是幻想。如果我可以正確讀取你的代碼,最初的問題是你的循環比geocoder.geocode每次返回都快。所以,沒有並行地理編碼調用的唯一方法就是在下一個啓動之前等待一個完成。也就是說,沒有必要進一步減慢循環 - 如果你試圖避免的是並行呼叫。如果您仍然希望在通話之間暫停,您仍然應該將回調與setTimeout結合使用。 – 2012-02-01 04:46:47

+0

是的,我想避免並行呼叫以及放慢循環。似乎沒有辦法讓谷歌的API同步行動,所以我必須將所有東西都疊加到他們的成功功能中。我會盡力瞭解你的代碼... – 2012-02-01 04:55:07

+0

以上消除了並行調用;如果(計數器<20) {window.setTimeout(function(){ dogeo(geoCallback); } },2000);'if(counter <20) window.setTimeout – 2012-02-01 04:59:42