Ci sono due modi principali per ottenere "multithreading" in Javascript. Il primo è una soluzione cross-browser, che funzionerebbe anche con i browser più vecchi, ma è più complicata da implementare.
L'idea alla base di questo è che si concede all'interfaccia utente un po 'di tempo per aggiornarsi di tanto in tanto. Poiché non c'è alcuna funzione di sospensione sincrona in Javascript, l'unico modo per ottenere ciò è utilizzare setTimeout (o setInterval con logica un po 'più complicata) per ritardare l'esecuzione di ogni ciclo dei calcoli complessi. Ciò darebbe al browser un po 'di tempo per aggiornare l'interfaccia utente tra i loop, dando l'effetto visivo di più cose che accadono simultaneamente. Alcuni ms dovrebbero essere più che sufficienti per l'interfaccia utente per riflettere le ultime modifiche.
Ha i suoi svantaggi, ovviamente, e può essere piuttosto difficile da implementare se ci sono più azioni che l'utente potrebbe voler fare mentre vengono eseguiti i calcoli in background. Inoltre, può rallentare drasticamente l'intero calcolo dello sfondo, poiché di tanto in tanto viene ritardato di alcuni ms. In casi specifici, tuttavia, fa il trucco e si comporta bene.
La seconda opzione sarebbe quella di utilizzare i web worker, che sono fondamentalmente script Javascript che funzionano indipendentemente in background, come una discussione. È molto più semplice da implementare, devi solo preoccuparti della messaggistica tra il codice principale e gli operatori in background, quindi l'intera applicazione non ne risente tanto. Puoi leggere di usarli dal link postato da Mic https://developer.mozilla.org/en/Using_web_workers. Il più grande svantaggio dei web worker è il loro supporto da parte dei browser, che puoi vedere su http://caniuse.com/#search=worker Non c'è soluzione alternativa per IE < 9 o browser per dispositivi mobili che simulano veramente l'effetto, quindi non c'è molto che tu possa fare per quei browser, ma poi di nuovo, i vantaggi dei browser moderni potrebbero superare il supporto di IE. Questo, ovviamente, dipende dalla tua applicazione.
Modifica: Non sono sicuro se ho spiegato chiaramente il primo concetto, quindi ho deciso di aggiungere un piccolo esempio. Il codice seguente è funzionalmente equivalente a:
for (var counter = 0; counter < 10; counter++) {
console.log(counter);
}
Ma invece di accesso 0-9 in rapida successione, ritarda 1s prima di eseguire la successiva iterazione del ciclo.
var counter = 0;
// A single iteration of your calculation function
// log the current value of counter as an example
// then wait before doing the next iteration
function printCounter() {
console.log(counter);
counter++;
if (counter < 10)
setTimeout(printCounter, 1000);
}
// Start the loop
printCounter();
hai dato un'occhiata ai webworker? https://developer.mozilla.org/en/Using_web_workers – Mic