Foros del Web » Programando para Internet » Javascript »

Ejecutar reiteradas vences una funcion con distintos delays

Estas en el tema de Ejecutar reiteradas vences una funcion con distintos delays en el foro de Javascript en Foros del Web. Bueno, eso. Necesito una ejecutar una función reiteradas veces, las que yo queira, y que entre cada iteración pueda definir el tiempo real entra cada ...
  #1 (permalink)  
Antiguo 17/08/2007, 11:30
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
Ejecutar reiteradas vences una funcion con distintos delays

Bueno, eso.
Necesito una ejecutar una función reiteradas veces, las que yo queira, y que entre cada iteración pueda definir el tiempo real entra cada repetición, digamos, en milisegundo.
Alguien me puede orientar ?
Saludos y Gracias.
__________________
| Cabeza De Raton |
  #2 (permalink)  
Antiguo 17/08/2007, 20:45
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: Ejecutar reiteradas vences una funcion con distintos delays

Hola:

Si temporizas con setTimeout, el segundo parámetro puede ser variable, por ejemplo puedes usar un valor aleatorio:
finbucle = false;
function recurrente() {
if (!finbucle)
setTimeout("recurrente()", Math.floor(Math.random () * 1000));
}

Si puse bien las cosas, la recurrencia será aleatoria entre 0 y 1000 milisegundos hasta que el evento que quieras ponga la variable global finbucle a true.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 18/08/2007, 09:06
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
Re: Ejecutar reiteradas vences una funcion con distintos delays

Gracias Caricatos. Es una función recursiva entonces.
__________________
| Cabeza De Raton |
  #4 (permalink)  
Antiguo 18/08/2007, 10:42
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: Ejecutar reiteradas vences una funcion con distintos delays

Cita:
Iniciado por Calisco Ver Mensaje
Gracias Caricatos. Es una función recursiva entonces.
`
¡No, no es recurrente (o recursiva)! simplemente suele usarse para hacer varias llamadas a una misma función, en muchas ocasiones para efectos de movimiento, y lo puede aparentar, pero no hay recursión.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 18/08/2007, 11:07
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
Re: Ejecutar reiteradas vences una funcion con distintos delays

Caricatos ... recursiva no es cuanto una función se llama a si misma ?.
Por otro lado, no importa mucho ahora que es lo que entiendo yo por recursividad.
En estos días lo implementé de una manera distinta. Algo asi ...

Código:
for (i=0; i<10; i++) {
   setTimeout("recurrente()", i*1000);
}
Más allá de algún error de sintaxis, lo que hago con esto es disparar 10 timers donde el primero dura 1 segundo y el ultimo 10. Pero los 10 se disparan al mismo tiempo, entonces puedo deducir que entre cada timer hay un segundo de diferencia, o sea, la función recurrente() la termino llamando 10 veces cada un segundo.
Si todo esto es correcto, necesito saber lo siguiente:

(1) Gasto mucha memoria al hacer esto ?. Pensemos que yo lo quiero, por ahí, para 500 o 1000 iteraciones.

(2) Cuanto mas recurso gasta este script a diferencia al que ha implemento Caricatos (arriba ?

(3) Cuan preciso es ?

(4) Eventos externos tipo onMouseDown, onClick, etc; afectan al funcionamiento ?

(5) Hay alguna forma de hacerlo mejor ?

Saludos y Graciasa.
__________________
| Cabeza De Raton |
  #6 (permalink)  
Antiguo 18/08/2007, 17:49
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
Re: Ejecutar reiteradas vences una funcion con distintos delays

Hola:

Yo personalmente por tradición uso la manera que te comenta caricatos, es decir, llamar al setTimeout dentro de la función. En respuesta a tus preguntas:

Cita:
Iniciado por Calisco
(1) Gasto mucha memoria al hacer esto ?. Pensemos que yo lo quiero, por ahí, para 500 o 1000 iteraciones.
Bueno, yo de memoria poco me preocupo en los setTimeouts. No creo que haya diferencia entre llamarlos todos de golpe y llamarlos poco a poco. Supongo que el gasto de memoria es mayor (o más instantáneo) cuando se llaman a todos los setTimeout a la vez, como es tu método.

Cita:
Iniciado por Calisco
(2) Cuanto mas recurso gasta este script a diferencia al que ha implemento Caricatos (arriba ?
Yo diría, casi con total seguridad, que hacer un bucle de 1000 iteraciones estableciendo un setTimeout ralentiza mucho más que hacer una llamada, y después establecer el setTimeout, para que luego esa segunda llamada establezca otro setTimeout (con un descanso).

El método de caricatos tiene la ventaja de que se puede cancelar dentro de la función si ocurre alguna condición (por ejemplo si un contador ha llegado a un número que no deseamos), o incluso llamarlo con diferentes lapsos de tiempo dependiendo de qué condiciones.

Cita:
Iniciado por Calisco
(3) Cuan preciso es ?
También, con casi ninguna duda, es que el más preciso es el del for inicial. Teniendo en cuenta que tu funcion x() tarda en ejecutarse t milisegundos, si hacemos una llamada y seteamos primer setTimeout, se establecerá con un retardo de t milisegundos. Mientras que si los seteamos todos desde el principio, quedan establecidos ya, no hay líneas que ejecutar antes del setTimeout. Ésto no se nota si x() es rápida, pero si x() tarda en ejecutarse 5sgs con la llamada dentro de la función lo que pasaría es:
1ª llamada: Ejecución de x(): sg: 0 - 5. Establecimiento de setTimeout a 10sg.
2ª llamada: Ejecución de x(): sg: 15 - 20. Establecimiento de setTimeout a 10sg.
3ª llamada: Ejecución de x(): sg: 30 - 35. Establecimiento de setTimeout a 1sg.
...
Y con el for creación de bucles...:
Establecemos todas las llamadas en el segundo 0, 10, 20...
1ª llamada: Ejecución de x(): sg: 0 - 5.
2ª llamada: Ejecución de x(): sg: 10 - 15. Establecimiento de setTimeout a 1sg.
3ª llamada: Ejecución de x(): sg: 20 - 25. Establecimiento de setTimeout a 1sg.

Aunque todo esto es teórico, y habría que probarlo, aunque lo veo difícil. Lo que habría que saber es si el navegador cuenta los segundos mientras está ocupado ejecutando otras cosas. Yo diría que no los cuenta, en ese caso los dos scripts actuarían igual.

Cita:
Iniciado por Calisco
(4) Eventos externos tipo onMouseDown, onClick, etc; afectan al funcionamiento ?
En realidad no sé a qué te refieres, supongo que es el mismo problema de la precisión. Un ejemplo bastaría para entenderlo (y para hallar solución, supongo).

Cita:
Iniciado por Calisco
(5) Hay alguna forma de hacerlo mejor ?
A mi no se me ocurre una manera de llamar a una función de esa forma, bueno sí, con un setInterval y cortando el intervalo cuando sea necesario dentro de la función, pero no valdría si hay que modificar variables pasadas por argumento (haciendo esas variables globales sí, pero no siempre es cómodo).



Bueno, espero que aclaremos ideas.
Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #7 (permalink)  
Antiguo 18/08/2007, 20:37
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: Ejecutar reiteradas vences una funcion con distintos delays

Hola:

Para que se tratase de recursión recurrente debería de hacer una llamada a recurrente o setTimeout a setTimeout, pero se trata de algo mucho más complejo, porque los procesos recursivos suelen "apilar" el estado del propio método recursivo, antes de la recursión, desapilándolas luego, pero estas llamadas son independientes... un par de casos de estudio fáciles son los factoriales y los fibonacci (las torres de hanoi son un poco más complejillas...)

Con los sistemas de temporización, se pueden cancelar/detener siempre que sean asignados a una variable y luego poner clearTimeout/clearInterval(variable)

Un ejemplo con Interval...

var contador = 0;
function segundero() {
if (contador++ == 10) clearInterval(temporizador);
// el resto del código...
}
var temporizador = setInterval("segundero()", 1000);

Sobre el tema de la memoria, es preferible no abusar de estos métodos, aunque creo que para tus objetivos no deberías preocuparte...

Por cierto, empecé a escribir un artículo sobre este tema, puedes verlo aquí: Controlar los tiempos

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #8 (permalink)  
Antiguo 20/08/2007, 01:28
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
Re: Ejecutar reiteradas vences una funcion con distintos delays

Ok, Gracias compas ....
__________________
| Cabeza De Raton |
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 23:06.