2012-07-20 37 views
5

Tengo un comportamiento muy extraño. Tengo el JQuery siguiente:¿El depurador JS suspende todo el ciclo de eventos JS?

myElement.fadeOut(100); 

Existe algún tipo de condición de carrera pasando, de tal manera que el elemento no termina encima de conseguir escondido. Si pongo un depurador en esa línea y paso por el código, funciona bien y el elemento se desvanece y se oculta. Llámalo Heisenbug.

Mi pregunta no es sobre la condición de carrera per se. Quiero saber cómo es posible que esto suceda dada la naturaleza del tiempo de ejecución de JavaScript. Por mi entender los siguientes predicados son verdaderas:

  1. fadeOut() se implementa por jQuery animado()
  2. animado() se implementa por una serie de setTimeout() llamadas
  3. setTimeout() programa la ejecución de una función en una cola en algún momento
  4. Cuando los eventos llegan al inicio de la cola, se ejecuta la función.
  5. Solo hay un bucle de eventos, que se ejecuta secuencialmente.
  6. En cualquier punto dado en el tiempo, solo se está ejecutando una función/ruta a través de la pila de llamadas.

Dado que estoy entrando en una función en mi depurador, la ejecución debe suspenderse y no se pueden ejecutar otras funciones.

No puedo ver cómo es posible que surja una condición de carrera en estas circunstancias. ¿Puede sugerir cómo es posible que la ejecución difiera entre código depurado y no depurado?

Respuesta

2

Sus puntos son correctos, excepto que se usa requestAnimationFrame() en lugar de si el navegador lo admite.

Una sesión de depuración puede tener un impacto en el comportamiento de su código si, por ejemplo, myElement se crea de forma asíncrona mediante una llamada AJAX pero se llama al fadeOut() sin esperar a que se complete la solicitud.

En ese caso, recorrer manualmente el código puede dar tiempo suficiente para que se devuelva la solicitud y se cree el elemento antes de fadeOut(), mientras que la solicitud no habría vuelto aún en el caso normal.

+0

Ah, ya sabes, hay una carga de ajax. Eso puede ser ... – Joe

+0

Usa el éxito o la devolución de llamada completa, no el tiempo de espera, si eso es lo que está sucediendo. Siempre asuma que ajax podría colgar por un tiempo. –

+0

¡Ciertamente no usé un tiempo de espera para ese propósito! – Joe