2010-02-04 45 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] 

它有一个后备使用超时的情况下,浏览器不支持工人。

相关问题