2014-07-06 24 views
5

Quando provo a console.log un oggetto in Chrome, viene indicato nella prima riga di console.log (dove si vede Object {piccolo riepilogo qui} che l'array dei miei post è di lunghezza 0. (messaggi: Array [0])Comportamento strano nell'oggetto chrome console.log

Tuttavia quando espande il post-it mostra che ha 27 articoli in esso (che è quello che ho bisogno)

questo accade a me in modo casuale e ho ottenuto. idea del perché sta accadendo, nessuno sperimentato prima

Screenshot:? Screenshot

Aggiornamento: Questo accade in tutti i browser, in modo che probabilmente non è Chrome legato

+0

La mia ipotesi migliore è che inizialmente abbia 0 elementi, ma poi l'oggetto viene aggiornato, quindi mostra la nuova versione al momento dell'espansione. – Scimonster

+0

L'ho provato prima e quando lo faccio: console.log (JSON.stringify()); poi ci sono anche tutti i post. Ma quando provo ad accedervi non è in grado di trovare alcun post. –

+0

Sì, la console lo fa. Come detto, deve essere stato zero al momento della stampa, ma probabilmente ripassa i dati. Lo stesso accade per un oggetto che viene stampato e poi usato e svuotato. La console mostrerà che ha ciò che hai usato, ma se estendi l'oggetto può essere vuoto. – GillesC

risposta

1

Il debugger non può sapere se un oggetto è stato modificato, questo è il motivo per cui il rendering dell'attributo posts (nel tuo esempio) non è stato aggiornato. Anche se il debugger fosse in grado di sapere quando un attributo è stato modificato aggiornandolo ogni volta (e tutte le "registrazioni") sarebbe troppo costoso.

Così il debugger controllerà l'attributo solo quando lo accede esplicitamente.

Chrome in questo caso farà anche solo una volta:

p = []; window.x = {x: p}; 
Object {x: Array[0]} 
x: Array[0] 
__proto__: Object 
x.x.push(1); 
1 
x.x.push(2); 
2 

Klicking x, aggiornamenti dell'array

p = []; window.x = {x: p}; 
Object {x: Array[2]} 
x: Array[2] 
    0: 1 
    1: 2 
    length: 2 
    __proto__: Array[0] 
__proto__: Object 

aggiungendo un articolo più alla matrice e toggleing x nuovo, la dimensione e le voci rimangono

x.x.push(3) 
3 


x: Array[2] 
    0: 1 
    1: 2 
    length: 2 
    __proto__: Array[0] 

A mio parere non è necessario che il logger aggiorni il valore dell'oggetto poiché l'orologio variabile ha già questa funzione. Qui puoi sempre aggiornare il valore corrente di una variabile.

Questo funziona in Firebug e Chrome. Ecco un esempio per Chrome:

Chrome: how to update variables in debugger watch

0

La risposta di "cerco-cache-finalmente" è corretto troppo ma voglio contribuire la risposta che ha causato il problema per accadere in primo luogo.

quando si dispone di questo codice:

var b = []; 
function a(callback) { 
    if (b.length > 0) { 
     return callback(); 
    } 

    doXhr(function() { 
     b.push("something"); 
    }) 
} 

quando ormai chiama un due volte, quindi la seconda chiamata non vedrà l'una aggiornato a causa delle richieste XHR ancora essere in corso, questo fa sì che la richiesta XHR di essere chiamato due volte.

La soluzione per questo è di aspettare sulla callback per una come questa:

a(function() { 
    a(function() { 
     // Correct trigger 
    }); 
}); 

Quindi, in realtà di base di programmazione asincrona, ma questo errore è stato a causa di una base di codice già esistente con questo bug in esso e era difficile rintracciare.