Foros del Web » Programando para Internet » Javascript »

setTimeout i Bucles incompatibles ?

Estas en el tema de setTimeout i Bucles incompatibles ? en el foro de Javascript en Foros del Web. Buenas tardes, tengo el siguiente códidog y no me da el resultado que deseo, alguien puede explicarme el porque, gracias: Código HTML: <script language= "javascript" ...
  #1 (permalink)  
Antiguo 30/09/2008, 09:53
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 8 meses
Puntos: 0
setTimeout i Bucles incompatibles ?

Buenas tardes, tengo el siguiente códidog y no me da el resultado que deseo, alguien puede explicarme el porque, gracias:

Código HTML:
<script language="javascript">
valor="";
valor1="";
function alerta(){
  alert("valores: "+valor+" "+valor1); 
}
tiempo=3000;
for(i=0;i<=5;i++){
  valor=i;
  valor1=0;
  setTimeout("alerta()",tiempo);
}
</script> 
Como resultado me da solo 1 "alert" con el contenido "valores: 5 0" y no entiendo porque no me da los siguientes alerts:
"valores: 0 0"
"valores: 1 0"
"valores: 2 0"
"valores: 3 0"
"valores: 4 0"
"valores: 5 0"
Alguien puede explicarme porque ?
  #2 (permalink)  
Antiguo 30/09/2008, 11:12
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: setTimeout i Bucles incompatibles ?

Lo que va a suceder es que saldrá 5 alert pero todos con el mismo contenido, porque el valor de la variable es reemplazada a cada paso del bucle quedando solo el último valor que es tomado por la función.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 30/09/2008, 11:50
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: setTimeout i Bucles incompatibles ?

Probá así:
Código PHP:
<script>
var 
tiempo=3000;
for(
i=0;i<=5;i++){
  (function(){
      var 
valor=i;
      var 
valor1=0;
      
setTimeout(function(){alert("valores: "+valor+" "+valor1);},tiempo);
  })();
}
</script> 
  #4 (permalink)  
Antiguo 01/10/2008, 01:21
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: setTimeout i Bucles incompatibles ?

Cita:
Iniciado por Panino5001 Ver Mensaje
Probá así:
Código PHP:
<script>
var 
tiempo=3000;
for(
i=0;i<=5;i++){
  (function(){
      var 
valor=i;
      var 
valor1=0;
      
setTimeout(function(){alert("valores: "+valor+" "+valor1);},tiempo);
  })();
}
</script> 
Esto lo que hace es mostrarme los 5 alerts con diferente contenido al cabo de 3 sgundos, pero solo el primero. Lo que me interesa es mostrarlos cada 3 segundos un alert distinto.
  #5 (permalink)  
Antiguo 01/10/2008, 03:45
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: setTimeout i Bucles incompatibles ?

Hola xinxan22:

Ten en cuenta que el bucle for se ejecuta rápidamente. 5 elementos, sí, pero se ejecuta rápidamente. Lo que haces es colocar 5 setTimeouts a 3 segundos cada uno, sería lo mismo que escribir los 5 setTimeouts uno detrás del otro.

Si quieres mostrar un setTimeout cada 3 segundos lo que tienes que hacer poner un setTimeout a 3, el siguiente a 6, el siguiente a 9 y así sucesivamente. Esto lo logras modificando a la variable tiempo por un índice (en este caso sería i+1). Así que la línea del setTimeout debería ser la que te dio panino (para no sobreescribir el valor de valor) y con el desfase tiempo*(i+1):
Código PHP:
setTimeout(function(){ alert("valores: "+valor+" "+valor1);}, tiempo*(i+1) ); 

Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #6 (permalink)  
Antiguo 01/10/2008, 09:38
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: setTimeout i Bucles incompatibles ?

El problema es que tengo un bucle for donde llamo a la funcion "mi_funcion()". Necesito mostrar llamar a "mi_funcion" cada 3 segundos por ejemplo, por eso lo estaba utilizando de esta manera.
Lo del alert era un ejemplo de llamar una función cualquiera.
  #7 (permalink)  
Antiguo 01/10/2008, 09:46
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: setTimeout i Bucles incompatibles ?

Hazle caso a derkenuke. Coloca intervalos de 3 entre cada setTimeout().
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #8 (permalink)  
Antiguo 03/10/2008, 01:45
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: setTimeout i Bucles incompatibles ?

Vale de esa manera me funciona perfecto. Ahora tengo un problema donde lo incluyo que tiene que no tiene mucho que ver con este tema pero aprovecho el post para exponerlo.

Estoy utilizando maps google para mostrar varios iconos (puntos) en el mapa, y claro el setTimeOut era para mostrar los puntos cada 3 segundos, entonces lo hago de la siguiente manera

Código HTML:
<script>
var punto;
var icono=new GIcon();

function maps_google(){
  //...
  //... aqui creo las variables y todo lo necesario para maps google
  //..
  points=new Array(contador);
  for(i=0;i<contador;i++){ 
    points[i]=new GLatLng(latitudes[i],longitudes[i]);
  }
  //Muestro los puntos en el mapa 
  for(i=1;i<contador-1;i++){ 
    (function(){ 
      punto=points[i]; //Vector de latitudes y longitudes
      icono=icon2;  //icono creado con icon2.image.... etc
      setTimeout("muestra_punto()",tiempo*(i+1)); 
    })(); 
  }
}
//
//
function muestra_punto(){
  var marker=new GMarker(punto,icono);
  map.addOverlay(marker);
}
</script> 
Por lo que he visto el temporizador funciona cada 3 segundos tal como me habeis dicho (poniendo un "alert()" dentro la función "muestra_punto()", aparece cada 3 segundos, sim embargo solo me muestra 1 punto en el mapa. Alguien puede echarme una mano?
  #9 (permalink)  
Antiguo 03/10/2008, 06:51
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: setTimeout i Bucles incompatibles ?

No será que no estás pasando la variable punto?
Código PHP:
setTimeout("muestra_punto("+punto+")",tiempo*(i+1)); 
Si es así, deberás agregar el argumento en la declaración de muestra_punto
Igualmente, no sé, habría que ver el contexto. No entiendo bien el uso de 2 bucles, por ejemplo.
  #10 (permalink)  
Antiguo 03/10/2008, 06:59
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: setTimeout i Bucles incompatibles ?

Tanto la variable punto como icono deben pasarse como parámetros a la función como indica Panino5001. Ya que aunque son variables globales y serán reconocidas dentro de la función solo tomará el último valor ya que el valor es reemplazado a cada paso del bucle.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #11 (permalink)  
Antiguo 03/10/2008, 09:28
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: setTimeout i Bucles incompatibles ?

Primero de todo, los dos bucles, los uso para cosas diferentes (uno es para rellenar el vector, el otro es para mostrarlo...falta parte de código solo he puesto lo esencial aquí).

Segundo, si llamo la función "muestra_punto" desde setTimeOut, no me deja pasarle las dos variables. Supongo que sería así:
Código HTML:
setTimeout("muestra_punto("+punto+","+icono+")",tiempo*(i+1));
Pues bién, no me hace la llamada a la función.

Las variables globales las he usado por el problema anterior (pasar dos variables), igualmente, las relleno antes de llamar la función y deberían tener contenido en cada caso:

Código HTML:
punto=points[i]; //Vector de latitudes y longitudes
      icono=icon2;  //icono creado con icon2.image.... etc
      setTimeout("muestra_punto()",tiempo*(i+1)); 
  #12 (permalink)  
Antiguo 03/10/2008, 09:40
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: setTimeout i Bucles incompatibles ?

Si fueran numéricas sí sería así, ahora, al ser string, hay que entrecomillarlas así:
Código PHP:
setTimeout("muestra_punto('"+punto+"','"+icono+"')",tiempo*(i+1)); 
  #13 (permalink)  
Antiguo 03/10/2008, 09:44
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: setTimeout i Bucles incompatibles ?

Beno no son ni una cosa ni la otra:

Código PHP:
points[i]=new GLatLng(latitudes[i],longitudes[i]);
var 
icon2=new GIcon(); 
entonces lo hago de la siguiente manera ?

Código PHP:
setTimeout("muestra_punto('"+points[i]+"','"+icon2+"')",tiempo*(i+1)); 
  #14 (permalink)  
Antiguo 03/10/2008, 09:47
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: setTimeout i Bucles incompatibles ?

Lo importante es lo que devuelven esos objetos. Como no sabemos qué tienen, sólo te resta probar y decirnos que tal te va ;)
  #15 (permalink)  
Antiguo 03/10/2008, 09:52
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: setTimeout i Bucles incompatibles ?

Es un objeto y guarda el icono:

var icon2=new GIcon();
icon2.image="mi_icono_que_mostrar.gif";

Guarda la latitud y longitud
points=new Array(contador);
for(i=0;i<contador;i++){
points[i]=new GLatLng(latitudes[i],longitudes[i]);
}
  #16 (permalink)  
Antiguo 06/10/2008, 02:00
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: setTimeout i Bucles incompatibles ?

Primero decir que no me funcionaba porquè estaba pasando mal los parametros a la función:

setTimeout("muestra_punto(punto,icono)",tiempo*(i+ 1));

y debería pasarselos así:

setTimeout("muestra_punto("+punto+","+icono+")",ti empo*(i+1));

Segundo, sigue sin funcionarme porquè les estoy pasando el objeto "icon2" el cual declaro: "var icon2=new GIcon();" como debería pasarselo a la función ?
  #17 (permalink)  
Antiguo 08/10/2008, 01:32
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: setTimeout i Bucles incompatibles ?

Como no se como pasarle un objeto en la función he echo lo siguiente:

function muestra_punto(punto){
var icono_magico=new GIcon();
icono.iconSize=new GSize(34,30);
icono.iconAnchor=new GPoint(16,29);
icono.image="mi_imagen.gif";
var marker=new GMarker(punto,icono);
map.addOverlay(marker);
}

Pero sigue sin funcionarme, podría ser que a maps.google no le guste que le lleguen las peticiones en intervalos de tiempo mientras se esta ejecutando ?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:52.