2013-05-12 183 views
0

我是網絡開發新手,並且一直在閱讀AJAX,因此我可以使用新數據更新地圖。我正在閱讀有關Comet的IBM文章。它們爲Apache Tomcat提供了一個實現。JavaScript調用堆棧

文章:http://www.ibm.com/developerworks/web/library/wa-cometjava/#resources

他們提供的是如下的JavaScript代碼..

<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()除非您明確指定不在open-method中。

go的調用不會導致堆棧溢出異常。這是因爲它在回調中被調用,並且數據返回時調用堆棧將被重置。它可能看起來像遞歸函數,但事實並非如此。雖然它是在go函數內部定義的,但執行上下文將完全不同。

+0

謝謝。這有很大幫助。 – user84628 2013-05-12 23:03:14

+0

好的,沒問題,樂意幫忙。請不要忘記投票/接受幫助你的答案。 – Kenneth 2013-05-12 23:07:38

0

go()只會在請求成功時執行,因此您一次只能有一個請求,我不認爲這會導致堆棧溢出,但遞歸函數可能會導致它像其他語言一樣。在JavaScript Ajax請求可以在異步或不異步模式的最後一個參數來執行對open()方法將確定模式中使用,你可以在這裏找到更多的細節http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp希望它能幫助:)

+1

謝謝。這有很大幫助。 :) – user84628 2013-05-12 23:03:34

0

request.send()是異步的 - 無論它是在內部產生一個新的線程,還是重用現有的線程,都是一個實現細節,但當request.open的最後一個參數是true時,它應該是異步的。

由於request.send()是異步調用,onreadystatechange調用(稍後會發生)不會與原始go共享堆棧。所以我預計堆棧溢出是不可能的。

+0

謝謝。這有很大幫助。 – user84628 2013-05-12 23:04:10