2012-02-01 20 views
7

Aşağıdaki döngünün her yinelemesinde 1-2 saniyelik bir gecikme eklemek istiyorum.javascript döngüsünü yavaşlatma

<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

Niçin aynı adresi 20 kez kodlarsınız? Örnek olarak – ceejayoz

+0

. Bazı API’ların (google gibi) tedarikçilerinin, kapılarında çok sert bir şekilde çarpmanızdan hoşlanmadığını belirttim. Bir zamanlayıcı kullanarak görüşme sıklığını azaltmak istiyorum, ancak bir döngüde kullanmakta sorun yaşıyorum, –

+0

Bu doğru, ama neden her seferinde aynı istekle kapılarına çarpıyorsunuz? – ceejayoz

cevap

11

Gün içinde bir çok setTimeout() ile bu şekilde yapabilirsiniz:

Arka arkaya aynı adresine 20 kez coğrafi kod araması yapıyoruz Bu yüzden beni merak yapmak yok
$(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; 
    });   
}); 

?

+0

mr arkadaş - lütfen –

4

Bunun için muhtemelen bir zamanlayıcı kullanmak istersiniz. Kodda bir gecikme döngüsü koymuş olsaydınız, sonuç yalnızca kodun daha uzun süre çalışmasını gerektirirdi, ancak son sonuç kod bittikten sonra bir kerede ortaya çıkar.

setTimeout veya setInterval yöntemlerini kullanabilirsiniz. Örnek:

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

Ben döngü kurtulmak ve setTimeout kullanarak almak öneririz:

$('#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

Ben coğrafi kod arama gerçekten tamamlanıncaya kadar yerine gelecek döngü iterasyon başlamak istemem bir his var. Yani, orada anahtar kelime

yerine for..., aşağıdakileri yapın. Biliyorum, alıştığınız bir şey olmayabilir, ama lütfen anlamaya çalışın (işe yaramalı).

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

numaralı telefona bakın setTimeout/setInterval kullanarak duraklama tümüyle sizin için işe yarayabilir, ancak bu bir yanılsamadır. Kodunuzu doğru bir şekilde okuyabiliyorsam, asıl sorun, döngüsünüzün geocoder.geocode'dan daha hızlı geri dönmesidir. Dolayısıyla, paralel coğrafi kod aramalarına sahip olmanın tek yolu, bir sonraki işlem başlatılmadan önce yapılması gerekene kadar beklemek olacaktır. Yani, döngüyü daha da yavaşlatmaya gerek yok - eğer kaçmaya çalışıyor olsaydınız paralel çağrılar vardı. Aramalar arasında hala duraklamak istiyorsanız, hala setTimeout ile birlikte geri aramaları kullanmalısınız. –

+0

Evet, döngüyü yavaşlatmanın yanı sıra paralel çağrılardan kaçınmak istiyorum. Google api'nin eşzamanlı olarak hareket etmesini sağlamanın bir yolu yok gibi görünüyor, bu yüzden her şeyi onların başarılarını benimsemem gerekiyor. Kodunuzu anlamaya çalışacağım ... –

+0

yukarıdaki paralel çağrıları ortadan kaldırır; aramalar arasında duraklatmak için şunu yapın: 'if (sayaç <20) window.setTimeout (function() { dogeo (geoCallback); } }, 2000);' –

İlgili konular