2013-07-12 24 views
9

Tôi muốn tách riêng chuỗi trên trang để ngăn chặn sự đóng băng của gui. Đối với điều này, tôi đang chạy các chức năng mà sẽ đóng băng gui bên trong một thread với setTimeout nhưng vẫn đóng băng.Chạy mã bên trong một chuỗi khác trong javascript

Mã và liên kết jsbin dưới:

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

Đó vẫn sẽ được thực hiện trong cùng một thread. Mọi thứ sẽ được thực hiện trong cùng một luồng. Ngoại lệ duy nhất là WebWorkers. – mishik

+0

nhưng yêu cầu jquery ajax đang hoạt động trong chuỗi khác nếu chúng ta nói 'async: true'. Tôi hiện đang tìm kiếm để tìm thông tin tốt về webworkers. Tôi cần phải chạy một cái gì đó trong các chủ đề khác trong khi gui vẫn có thể chạm và tải dữ liệu khác từ mạng. – uzay95

+1

Gọi lại cho yêu cầu ajax đó sẽ vẫn được thực thi trong cùng một chuỗi. 'async: true' sẽ chỉ có nghĩa là trình duyệt có thể dành thời gian giao dịch với các tác vụ khác trong khi chờ kết quả cuộc gọi ajax. – mishik

Trả lời

7

Thậm chí mặc dù bạn đã ủy quyền thực hiện qua setTimeout nó sẽ vẫn được thực hiện trong cùng một chuỗi đơn lẻ, nó sẽ chỉ chờ đợi thời gian của nó trong hàng đợi và sẽ trì hoãn bất kỳ hoạt động nào khác cho đến khi nó được thực hiện.

Vui lòng tham khảo hình ảnh tuyệt vời này từ "Bí mật của JS Ninja" cuốn sách:

enter image description here

3

javascript (trình duyệt) là một ứng dụng chủ đề duy nhất, vì vậy ngay cả khi bạn sử dụng một setTimeout tại bất kỳ thời điểm sẽ chỉ có một thread chạy (làm thực thi kịch bản, ui vẽ lại vv). Đọc thêm về cách thức timers work here

Vì bạn có một kịch bản chạy trong mỗi phần nghìn giây nó sẽ đóng băng các chủ đề do đó ngăn chặn các giao diện người dùng

2

Javascript là không đa luồng, bạn có thể muốn xem xét Web Workers

Các vấn đề liên quan