2011-08-24 6 views
6

Ecco un pezzo di codice dalla fonte jQuery (bit.ly/jqsource):ripetuto setTimeout() con 1 millisec

// The DOM ready check for Internet Explorer 
function doScrollCheck() { 
    if (jQuery.isReady) { 
     return; 
    } 

    try { 
     // If IE is used, use the trick by Diego Perini 
     // http://javascript.nwbox.com/IEContentLoaded/ 
     document.documentElement.doScroll("left"); 
    } catch(e) { 
     setTimeout(doScrollCheck, 1); 
     return; 
    } 

    // and execute any waiting functions 
    jQuery.ready(); 
} 

E 'un trucco per rilevare quando il DOM è pronto per IE. Mentre teoricamente questo sembra molto bello, sono un po 'preoccupato per setTimeout(doScrollCheck, 1);, il che significa che la funzione doScrollCheck() è chiamata 1000 volte al secondo prima che il DOM sia pronto.

Devo aspettarmi che questo sia un enorme drenaggio delle prestazioni?

+0

Ho difficoltà a vedere come questo * non * dovrebbe essere una perdita di prestazioni. Per lo meno stai bloccando il browser, che non è mai una buona idea. – Blazemonger

+1

Sì, questa è la mia domanda. Perché * non * è uno scarico delle prestazioni? (Perché presumo che le persone di jQuery stiano facendo un buon lavoro qui.) – Randomblue

+4

IE ha (o ha avuto?) Una durata minima 'setTimeout/setInterval' di qualcosa come' 13ms', quindi non è così male come 1000 /secondo. Più come 77/secondo. Di tutti i problemi di prestazioni di IE, non ho mai sentito lamentarsi del fatto che '' .ready() 'di jQuery sia un grosso problema. – user113716

risposta

3

La funzione setTimeout è quasi mai chiamata all'ora esatta richiesta. Il browser è libero di fare un +/- sul tempo di alcuni millisecondi, per lo meno, e se c'è un altro lavoro intenso in corso, può essere ritardato di secondi o più. Come altri hanno già menzionato, il browser implementa anche un timeout minimo. Questo 1 millisecondo dice semplicemente al browser "non appena hai finito di fare qualunque cosa tu stia facendo, fammi sapere così posso fare qualcosa". Produce anche l'esecuzione da Javascript in modo che il browser possa tornare a fare qualsiasi cosa farà dopo.

0

Non penso che sia - finché il DOM non è pronto, l'utente non può eseguire l'iterazione con una pagina e il controllo di ogni 1ms viene interrotto non appena il DOM è stato preparato.

Inoltre, questa funzione doScrollCheck non è la stessa cosa che fa setInterval (doScrollCheck, 1). Questi ultimi non aspettano che doScrollCheck finisca veramente, lo farebbe solo sparare la funzione di "Save Folder" il più velocemente possibile - QUESTO potrebbe essere un problema di prestazioni poiché ci sarebbero potenzialmente dozzine di chiamate sovrapposte alla stessa funzione.

io non sono sicuro se ho visto un altro modo di rilevare che DOM è pronto che controllando qualcosa (è di proprietà disponibili su documentElement in questo caso) a intervalli più lunghi/più breve.

+0

I browser non multi-thread l'ambiente Javascript per impostazione predefinita. La funzione setTimeout non verrà chiamata fino a quando il thread javascript attivo non ha prodotto l'esecuzione (elaborazione completata), al minimo. – Zimzat

+0

Mentre parlavamo di dozzine di chiamate sovrapposte, mi riferivo al possibile (sebbene non raccomandato in termini di prestazioni) eseguire qualcosa come "setInterval (doScrollCheck, 1)". In tal caso, il browser dovrebbe almeno fare le chiamate in coda a doScrollCheck mentre (come hai detto) ** eseguendo ** uno alla volta. – WTK

+0

Penso che quello a cui ti stai riferendo, ma non è chiaro da quello che hai detto, è che se più chiamate a fareScrollCheck() vengono fatte al di fuori della funzione, allora ciò che hai descritto accade. Se doScrollCheck() viene chiamato una sola volta, il problema che descrivi non si verifica. Sospetto che abbiano programmato il chiamante di questa funzione per impedirgli di farlo. – Zimzat

0

L'intervallo di timeout minimo è considerevolmente maggiore di 1 millisecondo. Se il tuo codice stava facendo molta manipolazione DOM, allora anche con la pausa forzata a un periodo più lungo avresti iniziato a riscaldare la CPU.

Alcuni nuovi browser (Firefox e Chrome, forse Safari) aumentano il timeout minimo di molto altro ancora per schede e finestre sfocate.

Anche un millisecondo è di tipo molto lungo per una CPU moderna.