2011-04-01 56 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

相关问题