有没有一种在javascript中执行长时间运行操作的好方法?例如,我有一个可能需要2分钟才能运行的功能。我们如何打破像这样的大型行动?如果我使用的是java或C,我会在后台线程中执行此任务。有没有办法告诉浏览器暂停脚本的执行,以便它可以让它的前台/ UI线程再次工作?像这样的东西?:
function bigJob() {
for (i = 0; i < 1000000; i++) {
someWork();
sleep(1000);
}
}
由于
答案 0 :(得分:3)
可能的方法:
这一切都取决于您的要求和约束
答案 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)
如果在浏览器上启用了弹出窗口等功能,您可以在查看区域外打开一个新窗口并让它执行您的脚本。