2010-02-04 72 views
6

有沒有一種在javascript中執行長時間運行的好方法?例如,我有一個可能需要2分鐘才能運行的功能。我們如何分解這樣的大型手術?如果我使用java或C,我會在後臺線程中執行此任務。有沒有辦法告訴瀏覽器暫停腳本的執行,以便它可以讓其前景/ UI線程再次工作?像這樣的東西?:在JavaScript中運行一個長操作?

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

感謝

+0

你想要使用一個計時器,並且每隔一段時間做一點工作。 – 2010-02-04 00:55:41

回答

2

如果你想它睡覺,你會在一個區間運行它:

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

function bigJob() { 
     somework(); 

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

你將不得不跟蹤功能迭代次數,並殺死間隔當您完成。

如果someWork()密集型,您仍然會在每個時間間隔掛起瀏覽器。

0

如果彈出式廣告和如在瀏覽器中啓用,你可以打開一個新窗口查看區域外,並讓它執行腳本。

3

可能方式:

  1. 單獨的窗口工作
  2. 塊交錯帶定時器
  3. HTML5工作線程
  4. NPAPI插件
  5. 擴展

這一切都歸結到您的要求& c onstraints。

2

你可以這樣做:

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

這將執行你的代碼,每100毫秒。

1

您可以在後臺運行較長的作業。

這是一個非常小的庫,它允許你這樣做: http://adambom.github.io/parallel.js/

它還使用所有的計算能力,因爲它橫跨在後臺的所有CPU核心滋生。

樣把一個艱鉅的任務,在後臺:

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

樣品多核:

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] 

它有一個後備使用超時的情況下,瀏覽器不支持工人。

相關問題