2012-04-21 14 views
8

Mi riferisco a this. Tutto non è ancora chiaro.JavaScript setTimeout interrompe l'esecuzione di altri script

  • Ho una funzione JS fillTree() che aggiorna un albero, ha le caselle di controllo.
  • Ho un'altra funzione checkSelectedBoxes() che viene eseguita su window.onload che controlla le caselle di controllo selezionate.
  • Ora ci sono molte altre funzioni connesse.

La mia domanda:

  • Se sto usando setTimeout() sarà l'altra funzione di script anche fermarsi e aspettare che la mia funzione per terminare il caricamento?

Quale potrebbe essere il caso in questo:

function fillTree(){...} 
function checkSelectedBoxes(){...} 

fillTree(); // This take time to get data. onLoad() doesnt work. 
setTimeout(function(){ checkSelectedBoxes() },5000); 

Ciò restituisce mi valori nulli, anche dopo l'aumento l'intervallo di tempo. fillTree() interrompe l'esecuzione?

+0

No, 'setTimeout' non mette in pausa l'esecuzione di altro codice. Se stai cercando di chiamare 'checkSelectedBoxes()' al completamento di 'fillTree()' perché non passarlo come parametro di callback, o semplicemente alla fine di 'fillTree()'? –

+0

@RoryMcCrossan grazie, la tua risposta sembra la migliore soluzione possibile ma è un CMS che sto usando e l'albero è impostato in qualche altro file js con cui non devo interferire dato che viene usato molte altre funzioni e i casi potrebbero non essere sempre stesso –

risposta

9

No, setTimeout non ti aspetta (quindi, JS non ha alcuna funzione di pausa). Quello che setTimeout fa è mettere da parte quell'attività in un secondo momento e consentire l'esecuzione della riga successiva. quando tale timeout viene raggiunto , inserisce tale attività nella riga di esecuzione. e quando nessun altro codice è in esecuzione, esegue la funzione indicata.

quello che vuoi fare è dare un callback al tuo fillTree() ed eseguirlo quando è finito.

function fillTree(callback){ 

    //do something very long 

    callback(); //execute passed function when it's done 
} 

fillTree(function(){ 
    checkSelectedBoxes(); //executes only when fillTree finishes 
}) 
+0

Grazie. Ciò ha chiarito tutto. Accetterò in 8 minuti: P. Anche la domanda non lo dice, ma potresti darmi dei consigli su quale dovrebbe essere il mio approccio? –

+0

cosa fa fillTree esattamente? è una chiamata Ajax? DOM che cammina? cosa ci vuole così tanto tempo? – Joseph

+3

"inserisce questa attività nella riga di esecuzione" non è completamente preciso. Non interromperà il codice utente né lo eseguirà contemporaneamente; verrà eseguito solo quando nessun codice utente JS è in esecuzione e il timeout è stato raggiunto. – Lucero

1

sua un CMS sto usando e l'albero si trova in qualche altro js file di cui sono non interferire con quanto viene utilizzato molte altre funzioni e casi può non essere sempre lo stesso

Se la funzione fillTree() non può essere modificata, è possibile includerla nella propria funzione e applicare una funzione di richiamata a tale funzione. Prova questo:

function doStuff(callback) { 
    fillTree(); 

    // Call the callback parameter (checkSelectedBoxes() in this case) 
    // when fillTree() has completed 
    callback(); 
} 

doStuff(checkSelectedBoxes); 
+0

La tua risposta mi ha aiutato con la mia funzione, ma la risposta alla mia domanda è stata data da @joseph. Grazie! –

0

La funzione setTimeout senza attendere l'esecuzione e si può chiaramente controllare nel seguente frammento. È possibile vedere come, dato l'intervallo waitTimes di volte casuali, la funzione Array.map stamperà prima tutti i valori time[index]=waitTimes[index], quindi wait[index]=waitTimes[index] quando lo setTimeout viene attivato esattamente dopo waitTimes[index] millisecondi.

var console = { 
 
    log: function(s) { 
 
    document.getElementById("console").innerHTML += s + "<br/>" 
 
    } 
 
} 
 
var roundDecimals = function(num, pos) { 
 
    pos = pos || 4; 
 
    return (Math.round(num * Math.pow(10, pos))/Math.pow(10, pos)); 
 
} 
 
var arrayRangeMap = function(a, block) { 
 
    c = []; 
 
    while (a--) c[a] = block(); 
 
    return c 
 
}; 
 
var getRandomArbitrary = function(min, max) { 
 
    return (Math.random() * (max - min) + min); 
 
    } 
 
    // random 10 wait times, 3 decimal positions 
 
var waitTimes = arrayRangeMap(10, function() { 
 
    return roundDecimals(getRandomArbitrary(0.250, 0.5, 3) * 1000, 2); 
 
}); 
 

 
waitTimes.map(function(item, index) { 
 
    setTimeout(function() { 
 
    console.log("wait[" + index + "]=" + item); 
 
    }, item); 
 
    console.log("time[" + index + "]=" + item); 
 
});
<div id="console" />

0

Ho appena fatto un test che ti potrebbero interessare:

<!DOCTYPE html> 
<html> 
    <head> 
    <script> 

/* test: if returns in around 1000ms, must interrupt, otherwise it is indeed 
    not going to let timeout work until work is done. */  
window.onload = function() { 
    var before = performance.now(); 
    setTimeout(function() { 
     alert('completed in ~' + (performance.now() - before) + ' nanoseconds.'); 
    }, 1000); 

    /* count to 2^31 - 1... takes 8 seconds on my computer */ 
    for (var i = 0; i < 0xffffffff; ++i) { 
     /* me busy, leave me alone */ 
    } 
};  
    </script> 
    </head> 
    <body> 
    </body> 
</html> 

Ora sono veramente curioso come JavaScript sa quando certo periodo di tempo è trascorso. Crea un thread che dorme per un periodo di tempo? E se è così, c'è un limite al numero di thread che dormono o che i thread dormono "memorizzati" fino a quando non sono necessari?Molto confuso.

Penso che abbia qualcosa a che fare con

"Se non ha bisogno di essere esattamente 1s, poi basta usleep un secondo. usleep e dormire mettere il thread corrente in uno stato di attesa efficiente che è almeno la quantità di tempo richiesto (e allora diventa idoneo per essere programmato di nuovo).

Se non si sta cercando di avvicinarsi ora esatta non c'è bisogno di controllare orologio() ".

- pthread sleep function, cpu consumption

quindi credo che il sistema operativo non la programmazione per voi, a quel punto interrompe il motore e il motore si ferma il mondo e mette la funzione di timeout in cima alla coda per essere eseguito il prima possibile?

Problemi correlati