Foros del Web » Programando para Internet » Javascript »

El lio con setInterval

Estas en el tema de El lio con setInterval en el foro de Javascript en Foros del Web. Bueno, esto inicio como una charla en twitter, pero creo que twitter pone limitaciones que no nos permiten expandirnos como quicieramos. La pregunta inicial fué ...
  #1 (permalink)  
Antiguo 29/08/2011, 08:41
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
El lio con setInterval

Bueno, esto inicio como una charla en twitter, pero creo que twitter pone limitaciones que no nos permiten expandirnos como quicieramos.

La pregunta inicial fué
Cita:
@john_acosta, @panino5001 saben si cuando usas setInterval, este pasa un parametro a la funcion que se llama?
Creo que esto se mal interpretó y se creyó que yo intentaba pasar una variable a setInterval. Esto no es así. Lo que yo encontré fué más intrigante, vean por si mismos:

Si usan fiefox, precionen
Código:
 ctrl + shit + k,
si no usan firefox, pues haganle como quieran XD

Ya abierta la consola de firefox pongan esto en el area de texto:
Código Javascript:
Ver original
  1. var a = function(p){alert(p);}; intervalID = setInterval(a, 2000);

ahora vean que el alert muestra un número. A mi al inicio me da 0, y me imagino que a ustedes también, pero después el numero empieza a cambiar, y no en una forma que tenga sentido aparente.

Yo dedusco que el número tiene que ver con el interval, pero no estoy seguro. Esto lo noté ayer con un script que hacía lo siguiente.

Código Javascript:
Ver original
  1. var func = function(para){
  2.      //some code here...
  3.      if(para){
  4.           para()
  5.      }
  6. }
  7.  
  8. intervalID = setInterval(func, 1000);

esto tiraba un error diciendo que
Código:
para
no es una función. Investigando el asunto, (unos cientos de lineas de código) pude reducir el problema a lo mencionado anteriormente.

Este es el lio del interval y me ha sorprendido. No conocía este lado de js.

Alguien tiene más info al respecto?

Cabe aclarar aquí que no estoy buscando una soulución al problema ya que de momento y sin pensar se me ocurren dos y son muy triviales. Yo lo que quiero es analizar el problema a fondo y determinar si esto es comportamiento esperado o un bug en el interprete, o otro de los muchos bugs del lenguage.
__________________
twitter: @imbuzu
  #2 (permalink)  
Antiguo 29/08/2011, 08:56
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 10 meses
Puntos: 834
Respuesta: El lio con setInterval

Es algo extraño. En Firefox tiene ese comportamiento. En otros navegadores devuelve undefined, que es en realidad lo que yo esperaría que devolviera.
  #3 (permalink)  
Antiguo 29/08/2011, 09:00
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: El lio con setInterval

Si, yo no probé en otros navegadores. Creo que es seguro empezar a decir que esto es un bug en el interprete de firefox. Ese zorro nos esta dejando quedar mal.
__________________
twitter: @imbuzu
  #4 (permalink)  
Antiguo 29/08/2011, 11:21
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: El lio con setInterval

Es curioso, pero no entiendo como puede ser un problema.

La documentacion de MDN es bastante clara al respecto:

Cita:
Callback arguments

setInterval() will pass the number of milliseconds late the callback was called into the callback function, which can confuse it if it expects something else as an argument. To sidestep that problem, use an anonymous function to call your callback.
Si vos asignas una funcion no anonima como callback del interval, automaticamente tomara el primer argumento que es el delay que tuvo para ejecutarse con respecto al estimado
__________________
blog | @aijoona
  #5 (permalink)  
Antiguo 29/08/2011, 11:22
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 10 meses
Puntos: 834
Respuesta: El lio con setInterval

Sólo para redondear el tema (que seguimos tratando fuera): El argumento extra es una característica de los navegadores Gecko y representa la latencia o demora en la ejecución:
Cita:
Note: Gecko passes an extra parameter to the callback routine, indicating the "lateness" of the timeout in milliseconds.
https://developer.mozilla.org/en/window.setTimeout

Demás está decir que no conviene usarlo para mantener la compatibilidad con el resto de los navegadores.
  #6 (permalink)  
Antiguo 29/08/2011, 15:11
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: El lio con setInterval

Aijoona, es un problema por que se buelve intrusivo.
Por ejemplo, una función que toma un parámetro opcional va a tener problemas. Hays oluciones sencillas, cierto, pero creo que un desarrollador no debería salirse de su ruta usual para solucionar un problema que es causado por que el navegador hace algo que no debaría (De hecho esto siempre lo hacemos, especialmente con IE, pero es muy molesto)

El ejemplo que pongo sobre el navegador dando un error por que "para" no es una función es muestra de que este comportamiento por parte del navegador es problemático.

Este comportamiento no es parte de ningún estandar (o yo creo que no lo es) y no esta presente en otros navegadores solo en aquellos basados en geko. Lo que es peor, el comportamiento se puede lograr de forma sencilla y que trabaje en cualquier navegador que tenga soporte para javascript y setInterval

El problema no es que el comportamiento sea dificil de superar, sino que es inesperado, y según lo que he leido, es inesperado para muchos programadores. Y el hecho de que sea un comportamiento exclusivo de navegadores basados en geko lo hace parecer más un bug que un comportamiento deceable.

Esto es solo mi opinión, que puede ser muy diferente de la de algún otro programador, pero son esas inconsistencias las que causan dolores de cabeza.
__________________
twitter: @imbuzu
  #7 (permalink)  
Antiguo 29/08/2011, 16:36
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: El lio con setInterval

Bueno, es cierto que es inesperado ya que no forma parte del estándar.

Pero por otro lado en tu código la raiz del problema es usar flags arguments :p
__________________
blog | @aijoona
  #8 (permalink)  
Antiguo 30/08/2011, 23:36
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: El lio con setInterval

No, no es mi código y no son flag arguments. Es un callback en un código de no se donde. Un cliente lo compró en algún lugar de esos donde venden scripts.
__________________
twitter: @imbuzu
  #9 (permalink)  
Antiguo 31/08/2011, 04:53
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: El lio con setInterval

De hecho, no solo tenés razon sino que es bastante claro en el ejemplo (para()). Lei cualquiera, disculpas jaj
__________________
blog | @aijoona
  #10 (permalink)  
Antiguo 31/08/2011, 12:51
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: El lio con setInterval

no hay problema :D Tus aportes siempre son buenos.
__________________
twitter: @imbuzu

Etiquetas: js, setinterval
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

SíEste tema le ha gustado a 4 personas




La zona horaria es GMT -6. Ahora son las 17:05.