2011-10-23 41 views
13

Tôi vẫn còn mới với Javascript. Tôi đang phát triển một trang đơn giản, nơi tôi nhấp vào một nút tìm nạp một giá trị trên một servlet và hiển thị nó. Nó hoạt động tốt, trừ khi tôi nhấp vào như điên trên nút. Đôi khi, kết quả được hiển thị là null.Các cuộc gọi đến các phương thức Javascript có an toàn hoặc đồng bộ hóa không?

tôi tự hỏi liệu điều này là do cuộc gọi đồng thời với chức năng tương tự sau đây:

function loadXMLDoc2(retr) { 
    var xmlhttp; 
    if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    } 
    xmlhttp.onreadystatechange=function() { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
      $("#" + retr).button('option', 'label', xmlhttp.responseText); 
      // document.getElementById(retr).innerHTML=xmlhttp.responseText; 
     } 
    } 
    var param = "cmd=" + encodeURIComponent(retr); 
    document.getElementById("TOP_LEFT").innerHTML = param; 
    xmlhttp.open("GET","/WebFront/Asynclet?" + param,true); 
    xmlhttp.send(null); 
} 

Javascript có thread-an toàn không? Và nếu không, làm thế nào tôi có thể đồng bộ hóa hoặc cô lập các cuộc gọi đến phương pháp này?

+0

Tôi nghĩ rằng hầu hết các trình duyệt đều cố gắng ngăn chặn điều kiện chủng tộc. Tôi không thấy bất kỳ khối đồng bộ hóa nào hoặc như vậy trong JavaScript vì nó được thiết kế để dễ dàng (và đơn luồng). –

Trả lời

31

Ngoài công cụ web HTML5 (được kiểm soát rất chặt chẽ), Javascript là luồng đơn nên không có vấn đề gì về an toàn luồng. Một luồng thực thi sẽ kết thúc trước khi bắt đầu một chuỗi tiếp theo.

Những điều như phản hồi ajax đi qua hàng đợi sự kiện và chỉ được thực hiện khi bất kỳ chuỗi thực hiện nào khác đã hoàn tất.

Xem Do I need to be concerned with race conditions with asynchronous Javascript? để biết thêm thông tin.

Để có cuộc thảo luận cụ thể về các cuộc gọi trả lời ajax, hãy xem How does JavaScript handle AJAX responses in the background?.

4

Trong ngữ cảnh của trình duyệt, JavaScript cơ bản là một luồng. (Có một số tính năng trình duyệt mới hơn cung cấp một loại mô hình luồng, nhưng tương tác luồng rất hạn chế và dữ liệu không thể được chia sẻ trực tiếp.)

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