2010-02-04 13 views
6

C'è un buon modo di eseguire un'operazione di lunga durata in javascript? Ad esempio, ho una funzione che può richiedere 2 minuti per essere eseguita. Come facciamo a rompere una grande operazione come questa? Se stavo usando java o C, avrei eseguito questa attività in un thread in background. C'è un modo per dire al browser di mettere in pausa l'esecuzione dello script in modo che possa lasciare il suo thread in primo piano/interfaccia utente di nuovo? Qualcosa di simile ?:Esecuzione di una lunga operazione in javascript?

function bigJob() { 
    for (i = 0; i < 1000000; i++) { 
     someWork(); 
     sleep(1000); 
    } 
} 

Grazie

+0

Si desidera utilizzare un timer e fare piccoli interventi ogni tanto. –

risposta

2

Se si vuole dormire, si dovrebbe eseguire in un intervallo:

var i = 0;  
var jobInterval = setInterval(bigJob, 1000); 

function bigJob() { 
     somework(); 

     i++; 
     if(i>1000000) { 
      clearInterval(jobInterval); 
     } 
} 

si dovrebbe tenere traccia del numero di iterazioni nella funzione, e uccidere l'intervallo quando si è fatto.

Se someWork() è intenso, si bloccheranno comunque il browser ad ogni intervallo.

0

Se popup e quali sono abilitati sul browser, è possibile aprire una nuova finestra al di fuori dell'area di visualizzazione e lo hanno eseguito lo script.

3

possibili modi:

  1. finestra separata
  2. pezzi di lavoro intercalati con timer
  3. thread di lavoro HTML5
  4. plug-in NPAPI
  5. estensione

Tutto si riduce a le tue esigenze & c onstraints.

2

Si potrebbe fare qualcosa di simile:

function bigJob() { 
    setInterval(function() doPartOfTheJob, 100); 
} 

Questo sarebbe eseguire il pezzo di codice ogni 100 ms.

1

È possibile eseguire il lavoro lungo in background.

Ecco una piccolissima libreria che permette di fare che: http://adambom.github.io/parallel.js/

Esso utilizza anche tutta la potenza di calcolo, perché genera in tutti i core della CPU in background.

di esempio per mettere un compito lungo in background:

var slowSquare = function (n) { 
    var i = 0; 
    while (++i < n * n) {} 
    return i; 
}; 
// Create a job 
var p = new Parallel(100000); 
// Spawn our slow function 
p.spawn(slowSquare).then(yourCallback); 

campione per multicore:

var p = new Parallel([40, 41, 42]), 
    log = function() { console.log(arguments); }; 

function fib(n) { 
    return n < 2 ? 1 : fib(n - 1) + fib(n - 2); 
}; 

p.map(fib).then(log); // returns [165580141, 267914296, 433494437] 

Ha un fallback da utilizzare Timeout nel caso in cui il browser non supporta i lavoratori.

Problemi correlati