2012-03-13 10 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).

Cuestiones relacionadas