2012-03-13 16 views
7

Un problema muy extraño.¿Console.dir() en javascript o firefox es asincrónico?

En mi depuración, encontré que console.dir (anArray) no generaba el valor actual en la consola Firebug del navegador.

Por ejemplo,

console.dir(anArray)    //line 1 
console.log(anArray[0].prop1)  //line 2 
code to change the value of anArray[0].prop1 //line 3 

la unArray es una matriz de objeto javascript/json,

en la consola del Firbug, línea 1 de salida el nuevo valor, que se establece en la línea 3,

y la línea 2 tiene un valor anterior, y es lo que quiero.

La única explicación es que console.dir() es asíncrono, ¿no?

mi env: Windows 7, Firefox 6.0.2, 1.9.1 firebug, javascript lib es DOJO (pero creo que no tienen nada que ver con ello.)

Gracias.

Respuesta

0

En resumen, sí. :)

Tuve un problema similar con Chrome en el pasado sin entender el resultado de mi consola, pero realicé algunas pruebas y descubrí que era un comportamiento asíncrono. De hecho, mi mejor opción es usar internamente un setTimeout() para retrasar el registro. console.log parece verse afectado también en mi caso.

0

Consola de registro a veces se asoma de esa manera. También es menos potente en Internet Explorer (un lugar común para encontrar errores), donde no puede imprimir cosas como objetos y documentos XML.

Sugiero que, en lugar de usar console.log, intente aprender a usar los potentes depuradores que los navegadores ponen a disposición. Cuando se detiene en un punto de interrupción, puede inspeccionar todas las variables, ejecutar declaraciones arbitrarias en la consola y subir y bajar el seguimiento de la pila.

0

es un bug en Firefox y Chrome: de ejecución en la consola:

console.log(a = {b: { c: 0}}); 
a.b.c = 1; 

el resultado en Firebug:

b: Object { c= 1 } 

el resultado en Chrome:

b: Object 
    c: 1 
2

Lo más importante con console.dir (al menos en Chrome, a juzgar por mi experiencia, y por this) es que la expansión evalúa y muestra el valor actual del objeto, en el momento en que se realiza la expansión, no aquellos en el momento de la llamada console.dir().

Véase, por ejemplo

<html><body> open/refresh this with the javascript console open 
<script> 
var ar = new Float32Array(1); 
ar[0]=2; 
console.log(ar[0]); 
console.dir(ar); 
ar[0]=200; 
</script> 

Al expandir la matriz en la consola, se ve el valor 200.

No se supone que sea un error, y sin duda es una cuestión de rendimiento (el objeto puede ser muy grande), pero el comportamiento es extraño y potencialmente confuso.

Además, he probado que si el valor cambia posteriormente, la consola no lo actualiza (por lo que tampoco funciona como una ventana de 'observación' en un depurador).