2011-10-23 2 views
13

저는 아직 자바 스크립트를 처음 사용합니다. 서블릿에서 값을 가져 와서 표시하는 버튼을 클릭하는 간단한 페이지를 개발 중입니다. 버튼을 미친 듯이 클릭하지 않으면 잘 작동합니다. 때로는 표시된 결과가 null입니다.Javascript 메서드에 대한 호출이 스레드로부터 안전하거나 동기화 되었습니까?

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); 
} 

자바 스크립트 스레드 안전 :

나는이이 같은 다음과 같은 기능에 대한 동시 호출에 의해 발생하는지 궁금? 그렇지 않은 경우이 메소드에 대한 호출을 어떻게 동기화하거나 분리 할 수 ​​있습니까?

+0

대부분의 브라우저는 경쟁 조건을 방지하려고합니다. 나는 자바 스크립트에서 동기화 블록을 보지 못했다. 쉬운 (그리고 싱글 쓰레드) 디자인이다. –

답변

31

HTML5 웹 작업자 (매우 엄격하게 제어 됨) 이외에 자바 스크립트는 단일 스레드이므로 스레드 안전성에는 문제가 없습니다. 하나의 실행 스레드는 다음 스레드가 시작되기 전에 완료됩니다.

Ajax 응답과 같은 것은 이벤트 대기열을 통과하며 다른 실행 스레드가 완료 될 때만 실행됩니다.

자세한 내용은 Do I need to be concerned with race conditions with asynchronous Javascript?을 참조하십시오.

ajax 응답 콜백에 대한 자세한 설명은 How does JavaScript handle AJAX responses in the background?을 참조하십시오.

4

브라우저 컨텍스트에서 JavaScript는 기본적으로 단일 스레드입니다. (일종의 스레딩 모델을 제공하는 최신 브라우저 기능이 있지만 스레드 상호 작용이 매우 제한되어 있고 데이터를 직접 공유 할 수 없습니다.)