在javascript中运行长时间的操作?

时间:2010-02-04 00:54:14

标签: javascript

有没有一种在javascript中执行长时间运行操作的好方法?例如,我有一个可能需要2分钟才能运行的功能。我们如何打破像这样的大型行动?如果我使用的是java或C,我会在后台线程中执行此任务。有没有办法告诉浏览器暂停脚本的执行,以便它可以让它的前台/ UI线程再次工作?像这样的东西?:

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

由于

5 个答案:

答案 0 :(得分:3)

可能的方法:

  1. 单独的窗口
  2. 与计时器交错的工作块
  3. HTML5工作线程
  4. NPAPI插件
  5. 扩展
  6. 这一切都取决于您的要求和约束

答案 1 :(得分:2)

如果你想让它睡觉,你可以在一个间隔内运行它:

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

function bigJob() {
      somework();

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

您必须跟踪函数中的迭代次数,并在完成后终止间隔。

如果someWork()是密集型的,您仍然会在每个时间间隔挂起浏览器。

答案 2 :(得分:2)

您可以执行以下操作:

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

这将每100毫秒执行一段代码。

答案 3 :(得分: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]

如果浏览器不支持工作人员,则可以使用超时。

答案 4 :(得分:0)

如果在浏览器上启用了弹出窗口等功能,您可以在查看区域外打开一个新窗口并让它执行您的脚本。