2013-07-12 32 views
9

我想单独在页面上的线程来防止gui冻结。为此,我正在运行一个函数,它会使用setTimeout在另一个线程中冻结gui,但仍然冻结。在javascript中的另一个线程内运行代码

的代码和jsbin链接低于:

<!DOCTYPE html> 
<html> 
<head> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js" 
    type="text/javascript"></script> 
    <meta charset="utf-8" /> 
</head> 
<body> 
    <div id="div1"></div> 
    <div id="div2"></div> 
    <input type="button" value="düðme" id="btn" /> 

    <script type="text/javascript"> 
     $("#btn").on("click",function(){ 
     $("#div1").html(new Date()); 
     }); 

     $(document).ready(function(){ 
     setTimeout(function() { count(); },1); 
     }); 

     function count(){ 
     for(var i =0;i<100000;i++){ 
      $("#div2").html(i); 
     } 
      $("#div2").append(new Date()); 
     } 
    </script> 

</body> 
</html> 
+2

这仍然会在同一个线程中执行。一切都将在同一个线程中执行。唯一的例外是WebWorkers。 – mishik

+0

但jquery ajax请求正在不同线程中工作,如果我们说'async:true'。我现在正在寻找关于网络工作者的好信息。我需要在其他线程中运行某些东西,而gui仍然可以触摸并从网络加载另一个数据。 – uzay95

+1

该ajax请求的回调仍将在同一个线程中执行。 'async:true'意味着浏览器在等待Ajax调用结果时可以花费一些时间处理其他任务。 – mishik

回答

7

即使尽管您已经通过setTimeout委托执行,但它仍将在同一个单独的线程中执行,它只会等待队列中的时间,并且会延迟其他任何活动,直到完成为止。

请参阅本真棒图片从书“JS忍者的秘密”:

enter image description here

3

的JavaScript(浏览器)是一个单线程应用程序,所以即使你在任何时间点使用的setTimeout只会有一个线程中运行(这样做脚本执行,ui重新绘制等)。了解更多关于如何timers work here

既然你有一个脚本在每毫秒运行,则冻结该线程从而阻塞UI

相关问题