2010-02-04 11 views
6

Gibt es eine gute Möglichkeit, eine lang andauernde Operation in Javascript durchzuführen? Zum Beispiel habe ich eine Funktion, die 2 Minuten dauern kann. Wie machen wir eine große Operation wie diese auf? Wenn ich Java oder C verwende, würde ich diese Aufgabe in einem Hintergrundthread ausführen. Gibt es eine Möglichkeit, den Browser anzuweisen, die Ausführung des Skripts anzuhalten, damit der Vordergrund/UI-Thread wieder funktionieren kann? So etwas wie dies ?:Eine lange Operation in Javascript ausführen?

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

Dank

+0

Sie möchten einen Timer verwenden und ab und zu kleine Aufgaben erledigen. –

Antwort

2

Wenn Sie es schlafen wollen, würden Sie es in einem Intervall laufen:

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

function bigJob() { 
     somework(); 

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

Sie würden die Anzahl der Iterationen in der Funktion zu verfolgen haben, und das Intervall töten, wenn Sie fertig sind.

Wenn someWork() intensiv ist, hängen Sie den Browser weiterhin in jedem Intervall.

0

Wenn Pop-ups und so auf dem Browser aktiviert sind, können Sie ein neues Fenster außerhalb des Sichtbereichs öffnen und haben sie das Skript auszuführen.

3

Mögliche Wege:

  1. eigenes Fenster
  2. Brocken Arbeit verschachtelt mit Timer
  3. HTML5-Worker-Threads
  4. NPAPI Plugin
  5. Erweiterung

Alles unten kommt zu Ihre Anforderungen & c Hindernisse.

2

Man könnte so etwas wie tun:

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

Dies würde Ihr Stück Code alle 100 ms auszuführen.

1

Sie können den langen Job im Hintergrund ausführen.

Hier ist eine sehr kleine Bibliothek, die Sie das tun können: http://adambom.github.io/parallel.js/

Es nutzt auch alle Rechenleistung, da es über alle CPU-Kerne im Hintergrund laicht.

Probe eine lange Aufgabe im Hintergrund zu setzen:

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

Beispiel für Multi-Core-:

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] 

Es hat einen Rückfall Timeouts zu verwenden, falls sich der Browser Arbeiter nicht unterstützt.

Verwandte Themen