Javascript 如何在递归中使用setTimeout以避免浏览器陷入复杂进程
我有这样一段代码,它使用了一个消耗大量内存的Javascript 如何在递归中使用setTimeout以避免浏览器陷入复杂进程,javascript,recursion,cpu-usage,single-threaded,Javascript,Recursion,Cpu Usage,Single Threaded,我有这样一段代码,它使用了一个消耗大量内存的低效进程(): 我的目标是使用某种setTimeout(function(){…},0)技术,这样浏览器在执行代码时就不会卡住 如何更改代码,使其与setTimeout一起工作? function powerOfTwo(num) { inefficientProcess(); if (num > 0) { return powerOfTwo(num-1)*2; } else { return
低效进程()
:
我的目标是使用某种setTimeout(function(){…},0)
技术,这样浏览器在执行代码时就不会卡住
如何更改代码,使其与setTimeout一起工作?
function powerOfTwo(num) {
inefficientProcess();
if (num > 0) {
return powerOfTwo(num-1)*2;
} else {
return 1;
}
}
function inefficientProcess() {
var sum;
for (var i=0; i < 500000; i++) {
sum+=10;
}
}
powerOfTwo(1000);
函数powerOfTwo(num){
无效流程();
如果(数值>0){
返回功率为2(num-1)*2;
}否则{
返回1;
}
}
函数无效进程(){
var和;
对于(变量i=0;i<500000;i++){
总和+=10;
}
}
powerOfTwo(1000);
当然,我的目标是学习如何在执行繁重的计算时避免浏览器崩溃。Javascript是单线程的,所有代码都是阻塞的。 HTML5中有一个新标准WebWorkers API,它允许您将任务委托给不同的线程。然后,您可以传递一个回调函数来执行结果 简单的例子:
function powerOfTwo(num, callback) {
var worker = new Worker('inneficient.js');
worker.postMessage('runTask');
worker.onmessage = function(event) {
var num = event.data.result;
var pow;
if (num > 0) {
pow = Multiply(num-1)*2;
} else {
pow = 1;
}
callback(pow);
};
}
powerOfTwo(1000, function(pow){
console.log('the final result is ' + pow);
});
在innficient.js中,您可以看到如下内容:
//infecient.js
function inefficientProcess() {
var sum;
for (var i=0; i < 500000; i++) {
sum+=10;
}
postMessage({ "result": sum});
}
inefficientProcess();
功能无效流程(){
var和;
对于(变量i=0;i<500000;i++){
总和+=10;
}
postMessage({“result”:sum});
}
无效流程();
正如Andre在回答中提到的,有一个新的HTML5标准,允许您在不同的线程上启动任务。否则,您可以调用时间为0的setTimeout,以允许在调用低效进程之前完成当前执行路径(以及可能要呈现的一些UI更改)
但是,无论您是否可以使用HTML5,powerOfTwo函数都必须更改为异步函数——无论谁调用它,都需要提供一个回调方法,当(a)通过WebWorkers旋转的线程返回时,或者(b)setTimeout方法完成时,将调用该回调方法
编辑以添加示例:
function powerOfTwo(num, callback)
{
setTimeout(function ()
{
inefficientProcess();
if (num > 0)
callback(Multiply(num-1)*2);
else
callback(1);
}, 0);
}
function inefficientProcess() { ... }
HTML元素允许您定义JavaScript
页面中的代码应该开始执行。“异步”和“延迟”
九月初,属性被添加到WebKit。Firefox已经被广泛使用
已经支持他们很久了
看到这个了所以…你在问如何打破
低效流程中的循环
,这样它只会在短时间内阻塞?你的问题是什么?能给我举个例子吗?我真的需要一些代码来理解如何处理这个问题函数powerOfTwo(num,callback){setTimeout(function(){lofficeprocess();if(num>0){callback(Multiply(num-1)*2);}else{callback(1);},0);}函数lofficeprocess(){var sum;for(var i=0;i<500000;i++){sum+=10;}}
如何触发此函数?powerOfTwo(100,whatgoesher)?另一个函数名放在那里。在Javascript中,函数被视为其他任何对象,因此您可以传入其他函数的名称作为回调:powerOfTwo(100,callbackFunctionName)
。或者您可以传入一个匿名函数(如我在示例中传入setTimeout的函数)。