2011-04-01 52 views
6

比方說,我有這樣的代碼在javascript:ajax調用的生命期是多少?

function doAnAjaxCall() { 
    var xhr1 = new XMLHttpRequest(); 
    xhr1.open('GET', '/mylink', true); 
    xhr1.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status==200) { 
      alert("Hey! I got a response!"); 
     } 
    }; 
    xhr1.send(null); 
} 

,讓在servlet代碼是:

public class RootServlet extends HttpServlet { 
    public void doGet (HttpServletRequest req, HttpServletResponse resp) throws IOException { 
     resp.getWriter().write("What's up doc?"); 
     resp.setStatus(200); 
    } 
} 

將xhr1仍然等待在readyState的新變化?或者一收到第一個響應,它就會關閉? 如果它仍然打開,會在一段時間後導致內存泄漏/較慢的瀏覽器並累積其中的一些? 我應該總是在servlet代碼的末尾調用resp.getWriter()。close()

,以及最後的jQuery的球迷在那裏:

確實$.ajax()表現爲在這方面XMLHttpRequest()

+3

這並不直接回答你的問題,但在你的例子中,你在調用send(null)後錯誤地設置了onreadystatechange,這是一個錯誤。 – 2011-04-01 02:00:51

+0

千萬不要這麼想,但在發送它之前設置事件處理程序是完全有意義的。我會讓我在真實的代碼中改變它。不過,我從來沒有遇到過這個問題。 – Aleadam 2011-04-01 02:07:16

回答

5

xhr1是否仍在等待readystate中的新更改?或者一旦得到第一個響應就會關閉?如果它仍然是開放的,會在一段時間後導致內存泄漏/較慢的瀏覽器並累積其中的幾個?

在幕後,它仍然是開放的。然而,它(和內存佔用)是網頁瀏覽器引擎的責任。它在池中維護一定數量的連接,每個域都有最大限制。例如,MSIE有一個錯誤,當用戶卸載(關閉)窗口時,它們仍然在運行時會泄漏。

我應該總是在servlet代碼的末尾調用resp.getWriter().close()嗎?

沒有必要。無論如何,servletcontainer會關閉它。自行關閉只會防止響應鏈中的一些(錯誤)代碼從寫入響應主體的風險。有關更多詳細信息,請參閱this answer

,以及最後的jQuery的球迷在那裏:確實$.ajax()表現爲在這方面XMLHttpRequest()

它底層使用XMLHttpRequest(僅當瀏覽器支持,否則它是MSIE ActiveX對象)。它在每次通話中構建一個新的。打開unminified source code,按Ctrl + F的jQuery.ajaxTransport(函數。所有的Ajax處理代碼差不多是200個loc,它涵蓋了所有可能的瀏覽器特定錯誤修復,你可以考慮。

+0

感謝您的詳細解釋。如果你不介意再看看它,我會用幾個新的簡短問題更新這篇文章。 – Aleadam 2011-04-01 14:15:28

+0

不客氣。這難道不適合另一個問題嗎? – BalusC 2011-04-01 14:16:18

+0

新的問題是:) – Aleadam 2011-04-01 14:53:49

相關問題