2013-07-12 31 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

相關問題