2010-02-04 17 views
6

Czy istnieje dobry sposób wykonywania długotrwałej operacji w javascript? Na przykład mam funkcję, która może potrwać 2 minuty. Jak rozpadniemy tak dużą operację? Gdybym używał java lub C, wykonywałbym to zadanie w wątku tła. Czy istnieje sposób, aby poinformować przeglądarkę, aby wstrzymała wykonywanie skryptu, aby mógł ponownie uruchomić swój wątek/wątek interfejsu użytkownika? Coś takiego ?:Uruchamianie długiej operacji w javascript?

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

Dzięki

+0

Chcesz korzystać z licznika czasu i od czasu do czasu wykonywać małe czynności. –

Odpowiedz

2

Jeśli chcesz go do snu, by uruchomić go w przedziale:

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

function bigJob() { 
     somework(); 

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

Trzeba by śledzić liczbę iteracji w funkcji i zabić interwał, gdy skończysz.

Jeśli funkcja someWork() jest intensywna, nadal będzie zawieszana przeglądarka w każdym interwale.

0

Jeśli okienka i takie są włączone w przeglądarce, można otworzyć nowe okno poza obszar wyświetlania i zlecić jego wykonanie skryptu.

3

Możliwe sposoby:

  1. osobnym oknie
  2. kawałki pracy przeplatane z zegarem
  3. HTML5 wątków roboczych
  4. wtyczki NPAPI
  5. Extension

To wszystko sprowadza się do twoje wymagania & c ograniczenia.

2

Można zrobić coś takiego:

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

byłoby to wykonać swój kawałek kodu, co 100 ms.

1

Możesz uruchomić długą pracę w tle.

Tutaj jest bardzo mały biblioteka, która pozwala, aby to zrobić: http://adambom.github.io/parallel.js/

Wykorzystuje również całą moc obliczeniową, ponieważ ikra we wszystkich rdzeni procesora w tle.

próbki umieścić czasochłonne zadanie w tle:

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

próbkę dla wielordzeniowych:

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] 

Posiada funkcję powrotu do wykorzystania limitów czasu w przypadku gdy przeglądarka nie obsługuje pracowników.

Powiązane problemy