Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas

Estas en el tema de Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas en el foro de Javascript en Foros del Web. ¿ por que ? Si llamamos varias veces a una función que crea un intervalo, y luego llamamos las mismas veces a otra funcion para ...
  #1 (permalink)  
Antiguo 20/02/2013, 14:30
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Exclamación Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas

¿por que?

Si llamamos varias veces a una función que crea un intervalo, y luego llamamos las mismas veces a otra funcion para limpiar el intervalo , las multiples llamadas a ese cleanInterval son superfuas, no funcionan, ¿por que?


Ejemplo interactivo : http://www.vodoad.com/basf.html

Ps. Pulsa una vez a la funcion que crea un intervalo y luego pulsa una vez a la funcion que "limpia" el intervalo, veras que todo funciona bien, ahora pulsa 1+ veces la funcion que crea un intervalo y pulsa las mismas veces la funcion para "limpiarlo" veras que ya no funciona correctamente.
  #2 (permalink)  
Antiguo 20/02/2013, 15:02
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas

Cita:
Iniciado por Albuss Ver Mensaje
¿por que?

Si llamamos varias veces a una función que crea un intervalo, y luego llamamos las mismas veces a otra funcion para limpiar el intervalo , las multiples llamadas a ese cleanInterval son superfuas, no funcionan, ¿por que?


Ejemplo interactivo : http://www.vodoad.com/basf.html

Ps. Pulsa una vez a la funcion que crea un intervalo y luego pulsa una vez a la funcion que "limpia" el intervalo, veras que todo funciona bien, ahora pulsa 1+ veces la funcion que crea un intervalo y pulsa las mismas veces la funcion para "limpiarlo" veras que ya no funciona correctamente.
@Albuss
Analicemos tu código, primero, cambias el color, pero una vez cambiado queda ahi, no se vuelve a cambiar con una condición
if style.color == algo
style.color = otra cosa ...
ok?

Segundo setTimeout demora la ejecución de la función x milisegundos, pero no la repite, salvo que hagas algo como

Código Javascript:
Ver original
  1. function rotate(){
  2. if (imagen_num > 3) {
  3. imagen_num = 0;
  4. }
  5. img = document.Source;
  6. img.src =img_array[imagen_num];
  7. imagen_num++;
  8. var t=setTimeout('rotate()',1000);
  9. }

es decir que una función se llama a si misma.
Tu ejemplo, corregido el tema de cambio de colores, se aplicaría tal vez si utilizases setInteval(), que si repite una función indefinidamente

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #3 (permalink)  
Antiguo 20/02/2013, 15:09
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas

no no, ovbiamente no he sabido concretar, me refiero a que si lanzas varias veces una llamada a una funcion que hace un settimeout, las 3 se ejecutan correctamente pero cuando intentas evitar que las 3 se ejecuten, no puedes, es decir:

Usando el ejemplo que expuse arriva : pulsa tres veces "lanzar timeout" , acto seguido pulsa tres veces "lanzar cleanTimeout" (hay tiempo de sobra ya que son 1.5sg) ¿resultado? el box cambiara de color si o si. ¿por que cleanTimeout no hace su trabajo si ha sido llamados las mismas veces despues de lanzar las mismas veces settimeout?

¿queda claro mi pregunta ahora?

Última edición por Albuss; 20/02/2013 a las 15:15
  #4 (permalink)  
Antiguo 20/02/2013, 15:17
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas

Si no me equivoco el problema es que cada settimeout genera un hilo diferente, y tu sólo guardas el último.

Ejemplo:

Interval=llamada1
Interval=llamada2
Interval=llamada3

Cuando intentes hacer el clearTimeout sólo detendrás la llamada3, las primeras 2 continuarán.
  #5 (permalink)  
Antiguo 20/02/2013, 15:21
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas

teoricamente cada vez que se llama a la funcion que lanzar el setinterval, la variable se reescribe. o al menos eso seria la teoria. y si es lo que tu dices ¿alguna sugerencia para limpiar todos los intervarls?
  #6 (permalink)  
Antiguo 20/02/2013, 15:30
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas

Sólo que los guardes en un array.
  #7 (permalink)  
Antiguo 20/02/2013, 15:55
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas

Cita:
Iniciado por ocp001a Ver Mensaje
Sólo que los guardes en un array.
Si, estás en lo cierto
Asi funciona
Código Javascript:
Ver original
  1. <script type="text/javascript">
  2. var Demoras=[];
  3. function changeColor(){
  4. Demoras[Demoras.length] =setTimeout(function(){document.getElementById('cuadrado').style.background = 'hsla(300,100%,50%,1)'; },3000); 
  5. console.log(Demoras.length);
  6. }
  7. function evitarcambiarColo(){
  8. if (Demoras) for (var i in Demoras) if (Demoras[i]) clearTimeout(Demoras[i]);
  9. Demoras = [];
  10. }
  11. </script>

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #8 (permalink)  
Antiguo 20/02/2013, 17:19
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas

Gracias! a los dos.
  #9 (permalink)  
Antiguo 20/02/2013, 17:45
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Ejemplo Interactivo :Clear Intevarls Error para multiples llamadas

Una pregunta rapida;

referente a a esta linea de codigo :

Código Javascript:
Ver original
  1. if (Demoras) for (var i in Demoras) if (Demoras[i]) clearTimeout(Demoras[i]);

No seria mas simple hacer esto :

Código Javascript:
Ver original
  1. for(i=0;i<Demoras.length;i++){
  2.         clearTimeout(Demoras[i]);
  3.     }


Aunque es rebundante, el segundo if(demoras[i]) es superfluo, o al menos, en lo que humildemente entiendo sobre JS, si un for ve que una array no tiene mas valores en su indice, se para de ejecutar ¿estoy equivocado, verdad?

Etiquetas: Ninguno
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 17:46.