2013-05-12 2 views
0

저는 웹 개발에 익숙하지 않고 AJAX에서 새로운 데이터로 라이브지도를 업데이트 할 수 있도록 읽고 있습니다. Comet에 관한 IBM의 기사를 읽었습니다. Apache Tomcat에 대한 구현을 제공합니다.자바 스크립트 호출 스택

기사 : http://www.ibm.com/developerworks/web/library/wa-cometjava/#resources

들은 다음과 같다 제공하는 자바 스크립트 코드 ..

<SCRIPT TYPE="text/javascript"> 
      function go(){ 
       var url = "http://localhost:8484/WeatherServer/Weather" 
       var request = new XMLHttpRequest(); 
       request.open("GET", url, true); 
       request.setRequestHeader("Content-Type","application/x-javascript;"); 
       request.onreadystatechange = function() { 
        if (request.readyState == 4) { 
         if (request.status == 200){ 
          if (request.responseText) { 
           document.getElementById("forecasts").innerHTML = 
request.responseText; 
          } 
         } 
         go(); 
        } 
       }; 
       request.send(null); 
      } 
     </SCRIPT> 
    </head> 
    <body> 
     <h1>Rapid Fire Weather</h1> 
     <input type="button" onclick="go()" value="Go!"></input> 
     <div id="forecasts"></div> 
    </body> 

나는이 모든 것을 이해하지만, 몇 가지 질문이 있습니다.

1) request.send()가 새 스레드를 생성합니까? 2) go()에 대한 재귀 호출은 결국 스택 오버플로를 유발합니까?

답변

0

당신은 오픈 방식으로하지 명시 적으로 지정하지 않는 새로운 스레드가 당신이 request.send()을 수행 할 때 생성됩니다.

go을 호출해도 절대로 stackoverflow 예외가 발생하지 않습니다. 이것은 콜백에서 호출되고 데이터가 반환 될 때 콜 스택이 재설정되기 때문입니다. 재귀 함수처럼 보일 수도 있지만 그렇지 않습니다. go-function 내부에 정의되어 있지만 실행 컨텍스트는 완전히 다릅니다.

+0

감사합니다. 그것은 많은 도움이되었습니다. – user84628

+0

OK, 문제 없습니다. 도와 드리겠습니다. 투표에 도움이되는 답변을 수락하시는 것을 잊지 마십시오. – Kenneth

0

이동() 만 나는 그것이 스택 오버 플로우하지만 재귀 함수는 다른 모든 언어처럼 될 수 있습니다을 일으킬 것이라고 생각하지 않습니다 한 번에 하나 개의 요청을해야하므로 요청이 성공하는 경우에만 실행됩니다 . 자바 스크립트에서 Ajax 요청은 :

+1

감사합니다. 그것은 많은 도움이되었습니다. :) – user84628

0

request.send()가 비동기 도움이되기를 바랍니다 여기 http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp 더 많은 정보를 찾을 수 있습니다 사용하는 모드를 결정합니다 open() 메서드에 비동기 여부를 비동기 모드에서 마지막 매개 변수를 실행할 수 있습니다 - 내부적으로 새 스레드를 생성하거나 기존의 일부 스레드를 재사용하는지 여부는 구현 세부 사항이지만 request.open의 마지막 매개 변수가 true이면 비동기이어야합니다.

request.send()은 비동기이므로 전화 (나중에 발생)는 원본 go과 스택을 공유하지 않습니다. 그래서 스택 오버플로가 불가능할 것으로 예상됩니다.

+0

고맙습니다. 그것은 많은 도움이되었습니다. – user84628