2013-07-12 22 views
9

Chcę oddzielić wątek na stronie, aby zapobiec zamrożeniu gui. W tym celu uruchamiam funkcję, która zamrozi gui wewnątrz innego wątku z setTimeout, ale nadal zamarza.Uruchamianie kodu wewnątrz innego wątku w javascript

Kod i Link jsbin są poniżej:

<!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

Że nadal będą wykonywane w tym samym wątku. Wszystko zostanie wykonane w tym samym wątku. Jedynym wyjątkiem są WebWorkers. – mishik

+0

, ale żądania ajax jquery działają w różnych wątkach, jeśli powiemy 'async: true'. Szukam teraz dobrych informacji na temat webworkerów. Muszę uruchomić coś w innych wątkach, podczas gdy gui wciąż jest dotykalny i ładuję kolejne dane z sieci. – uzay95

+1

Callback dla tego żądania ajax nadal będzie wykonywany w tym samym wątku. 'async: true' będzie po prostu oznaczać, że przeglądarka może spędzić trochę czasu zajmując się innymi zadaniami, czekając na wyniki wywołania ajax. – mishik

Odpowiedz

7

Even chociaż delegowałeś wykonanie przez setTimeout, nadal będzie on wykonywany w tym samym pojedynczym wątku, będzie czekał tylko na swój czas w kolejce i odłoży jakąkolwiek inną czynność, dopóki nie zostanie ukończony.

Proszę odnieść się do tej wspaniałej zdjęciu z „Tajemnice JS Ninja” książki:

enter image description here

3

javascript (przeglądarka) jest pojedyncza aplikacja wątek, więc nawet jeśli używasz setTimeout w dowolnym momencie będzie tylko jedna nić (robi wykonanie skryptu, ponowne malowanie interfejsu itp.). Przeczytaj więcej o tym, jak timers work here

Skoro masz skrypt uruchomiony w każdej milisekundy będzie zamrażać nić blokując w ten sposób UI

Powiązane problemy