2010-02-04 18 views
6

¿Existe alguna forma de realizar una operación larga en javascript? Por ejemplo, tengo una función que puede tardar 2 minutos en ejecutarse. ¿Cómo dividimos una operación grande como esta? Si estuviera usando java o C, realizaría esta tarea en un hilo de fondo. ¿Hay alguna manera de decirle al navegador que pause la ejecución del script para que pueda volver a funcionar su subproceso en primer plano/interfaz de usuario? Algo como esto ?:¿Se está ejecutando una operación larga en javascript?

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

Gracias

+0

Desea utilizar un temporizador y hacer pequeños trabajos de vez en cuando. –

Respuesta

2

Si lo desea dormir, tendría que ejecutar en un intervalo:

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

function bigJob() { 
     somework(); 

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

que tendría que realizar un seguimiento del número de iteraciones de la función, y matar el intervalo cuando haya terminado.

Si someWork() es intensivo, aún colgará el navegador en cada intervalo.

0

Si tales ventanas emergentes y están habilitados en el navegador, puede abrir una nueva ventana exterior del área de visualización y lo han ejecutar la secuencia de comandos.

3

maneras posibles:

  1. ventana separada
  2. trozos de trabajo intercalados con temporizador
  3. subprocesos de trabajo HTML5
  4. complemento NPAPI
  5. Extensión

Todo se reduce a sus requisitos & c onstraints.

2

Se podría hacer algo como:

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

Esto ejecutar su pieza de código cada 100 ms.

1

Puede ejecutar el trabajo largo en segundo plano.

Aquí es una biblioteca muy pequeña que le permite hacer eso: http://adambom.github.io/parallel.js/

También utiliza toda la potencia de cálculo, ya que genera en todos los núcleos de la CPU en el fondo.

Muestra de poner una tarea larga en el fondo:

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); 

de muestras para múltiples núcleos:

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] 

Tiene una reserva para utilizar tiempos de espera en caso de que el navegador no es compatible con los trabajadores.

Cuestiones relacionadas