2012-05-15 17 views
0

我用setTimeout函数包装了长时间运行的逻辑(longLoop),但直到长时间运行的执行结束,UI仍然无响应。它不允许点击其他UI按钮。请看下面的例子,如果有任何问题,请告诉我。SetTimeout函数仍然使用户界面无响应,直到其操作超过

function longLoop() { 
    var startLogTime, endLogTime; 
    startLogTime = new Date().getTime(); 
    console.log("loop begin"); 
    for (var i = 0; i <= 500000000; i++) { 
     var j = 10; 
    } 
    endLogTime = new Date().getTime(); 
    console.log("loop execution takes " + (endLogTime - startLogTime) + " milliseconds"); 
} 

$(document).ready(function() { 

    $("#btnButton").bind("click", function() { 
     setTimeout(longLoop, 15); 

    }); 

    $("#anotherButton").bind("click", function() { 
     console.log("another operation clicked"); 
    }); 
}); 

<input type="button" id="btnButton" value="Start Long Operation" /> 
<input type ="button" id="anotherButton" value= "Another operation" /> 

感谢

+0

JavaScript是“单线程”的。很确定'setTimeout'在运行时不会自己创建“线程”,它只是稍后运行。 –

回答

6

尽管这是“异步”,setTimeout仍然分派其对主事件循环调用。由于主事件循环还会接收点击,键盘输入以及网页可能发送的每一个事件,因此您只需延迟您的长操作冻结UI的时刻即可。

如果您希望与主事件循环并行运行您的操作,您应该查看Web workers,它生成真正的线程(带有一些重要的约束条件)。

0

JavaScript是单线程的,所以总是有一个方法正在运行。一旦longLoop开始,没有别的可以做。您可以通过使用新的HTML5 web workers来规避此限制。

0

的JavaScript is not a mutithreaded language,即使您使用的setTimeout,它在主线程中运行,你只是推迟了手术,你应该看看Web-Workers,新的JavaScript API在后台运行CPU密集型任务

相关问题