2012-02-01 11 views
7

Me gustaría agregar un retraso de 1-2 segundos en cada iteración del siguiente ciclo.cómo desacelerar un bucle de 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

¿Por qué geocodifica la misma dirección 20 veces? – ceejayoz

+0

como un ejemplo. Noté que a algunos proveedores de API (como google) no les gusta que golpeen con demasiada frecuencia en sus puertas. Me gustaría reducir la frecuencia de la llamada usando un temporizador, pero tengo problemas para usarlo en un bucle, –

+0

Eso es cierto, pero ¿por qué golpearías sus puertas con la misma solicitud cada vez? – ceejayoz

Respuesta

11

Usted puede hacerlo de esta manera con 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; 
    });   
}); 

Esto hace que me pregunto por qué estás haciendo una búsqueda de códigos geográficos en la misma dirección exacta de 20 veces en una fila?

+0

amigo del Sr. - vea arriba –

4

Probablemente desee utilizar un temporizador para esto. Si simplemente pusiera un ciclo de retardo en el código, el resultado sería que el código tarda más en ejecutarse, pero el resultado final se mostrará todo de una vez después de que el código haya finalizado.

Puede usar los métodos setTimeout o setInterval. Ejemplo:

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

Animo a deshacerse del bucle y usando 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

Tengo la sensación de que prefiere no comenzar siguiente iteración del bucle hasta que la consulta de codificación geográfica es realmente completa. Entonces, la palabra clave allí es "devolución de llamada":

en lugar del for..., haga lo siguiente. Sé que puede no ser algo a lo que estés acostumbrado, pero intente captarlo (debería funcionar).

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

Hacer una pausa usando setTimeout/setInterval puede funcionar para usted, pero es una ilusión. Si puedo leer su código correctamente, el problema original es que su bucle es más rápido que geocoder.geocode regresa cada vez. Por lo tanto, la única forma de no tener llamadas de geocodificación paralelas sería esperar hasta que se termine antes de que se inicie el siguiente. Dicho esto, no hay necesidad de ralentizar aún más el ciclo, si todo lo que intentas evitar son las llamadas en paralelo. Si aún desea hacer una pausa entre llamadas, aún debe usar las devoluciones de llamadas en combinación con setTimeout. –

+0

Sí, me gustaría evitar las llamadas paralelas y ralentizar el ciclo. Parece que no hay manera de hacer que las API de Google actúen de forma sincronizada, así que tengo que apilar todo en sus funciones de éxito. Trataré de entender tu código ... –

+0

lo anterior elimina llamadas paralelas; para pausar entre llamadas, haga esto: 'if (counter <20) { window.setTimeout (function() { dogeo (geoCallback); } }, 2000);' –

Cuestiones relacionadas