2012-03-13 12 views
7

Un problema molto strano.È console.dir() in javascript o firefox asincrono?

Nel mio debug, ho trovato che console.dir (anArray) non ha emesso il valore corrente sulla console firebug del browser.

Ad esempio,

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

l'anArray è un array di oggetti JavaScript/json,

nella console Firbug, linea 1 uscita il nuovo valore, che si trova in linea 3,

e la riga 2 è vecchio valore ed è ciò che voglio.

L'unica spiegazione è che console.dir() è asincrono, giusto ?!

mia env: Windows7, Firefox 6.0.2, Firebug 1.9.1, javascript lib è DOJO (ma credo che non hanno nulla a che fare con esso.)

Grazie.

risposta

0

In breve, sì. :)

Ho avuto un problema simile con Chrome in passato non capendo il risultato della mia console, ma ho eseguito alcuni test e ho scoperto che era un comportamento asincrono. In realtà, la mia migliore scommessa è che usa internaly un setTimeout() per ritardare il log. console.log sembra essere interessato anche nel mio caso.

0

I log della console a volte escono fuori così. È anche meno potente in Internet Explorer (un luogo comune per trovare bug), dove non può stampare oggetti come oggetti e documenti XML.

Suggerisco che invece di usare console.log si cerchi invece di imparare come usare i potenti debugger che i browser rendono disponibili. Quando si è in pausa su un punto di interruzione, è possibile esaminare tutte le variabili, eseguire istruzioni arbitrarie sulla console e andare su e giù nella traccia dello stack.

0

Si tratta di un bug in Firefox e Chrome: run in consolle:

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

il risultato in Firebug:

b: Object { c= 1 } 

il risultato in Chrome:

b: Object 
    c: 1 
2

La grande cosa con console.dir (almeno in Chrome, a giudicare dalla mia esperienza, e dal this) è che l'espansione valuta e mostra il valore corrente corrente nel momento in cui si esegue l'espansione, non quelli al momento della chiamata console.dir().

Vedi per esempio

<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> 

Quando si espande la matrice nella console, si vede il valore di 200.

Non dovrebbe essere un bug, ed è sicuramente una cosa da prestazione (l'oggetto può essere molto grande), ma il comportamento è strano e potenzialmente confuso.

Inoltre, ho verificato che se il valore cambia in seguito, la console non lo aggiorna (quindi non funziona nemmeno come finestra di 'watch' in un debugger).

Problemi correlati