我有一个软件设计问题是什么是处理客户端javascript程序的最佳方法,该程序依赖于多个(但大部分是连续的,不是同时的),短命的AJAX调用作为服务器响应用户交互[在我的特定情况下,它将是一个facebook-GAE / J应用程序,但我相信这个问题与任何客户端(浏览器)/服务器设计相关]。
首先,我问了这个问题:What is the life span of an ajax call?。根据BalusC的答案(我鼓励它阅读there ),简短的回答是“这取决于浏览器”。所以,现在我还没有真正控制服务器发送响应后发生的事情。
如果AJAX调用的主要用途是从服务器只检索一次,是否可以手动销毁它? xhr1.abort()会这样做吗?
或者,最好的选择就是这样吗?手动关闭每个连接(如果可能的话)会给每次调用增加太多开销吗?
是否可以手动设置每个域的限制?
最后(但并非最不重要!),我真的应该担心这个吗?什么是大量的调用足以开始延迟浏览器(特别是一些IE浏览器与BalusC在另一个问题中提到的泄漏错误?请记住,这是我的第一个javascript / java servlets项目。
提前谢谢
答案 0 :(得分:7)
XHR
的使用范例是您不必担心对象会发生什么 - 浏览器的引擎会在幕后为您处理。因此,我认为尝试手动“改进”事物没有任何意义。浏览器开发人员当然知道99.9999%的JS程序员不这样做,因此他们不仅考虑了它,而且可能也针对该场景进行了优化。
至于限制每个域的AJAX调用数量(并发未完成的调用,或者所做的总调用,或者您可能感兴趣的任何其他度量),解决方案将是古老的CS经典:添加另一层抽象。
在这种情况下,额外的抽象层将是一个函数,通过它可以路由所有AJAX调用;然后,您可以实现跟踪每个呼叫进度的逻辑(如果您需要,则为每个域),并根据该状态拒绝或推迟传入呼叫。要正确得到它并不容易,但它确实可行。
但是,我建议也不要担心这个,除非你手上有一个具体的问题。 :)
<强>更新强>
浏览器会对并发的AJAX调用强制执行自己的限制;这里有一个非常好的问题:How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?
另外,正如TJ Crowder在评论中提到的那样:确保在完成XHR对象时不要保留对XHR对象的引用,以便它们可以被垃圾收集 - 否则,你创建资源泄漏自己。
第二次更新:
关于重用XHR here的博客文章很好 - 它实际上是相关帖子的链的开头。在不利方面,它已过时,并没有得出任何实际结论。但它涵盖了重复使用XHR的机制。
答案 1 :(得分:4)
如果AJAX调用的主要用途是从服务器只检索一次数据,是否可以手动销毁它? xhr1.abort()会这样做吗?
它只会中止正在运行的请求。它不会关闭连接。
或者,最好的选择就是这样吗?手动关闭每个连接(如果可能的话)会为每次调用增加太多开销吗?
不可能。这是浏览器的责任。
是否可以手动设置每个域的限制?
无法从服务器端开启。这是特定于浏览器的设置。最好的方法是在某个页面对话框中询问最终用户如果尚未完成更改设置。但这毕竟没有意义,当然不是最终用户完全不理解这背后的理由。
最后(但并非最不重要!),我真的应该为此担心吗?什么是大量的调用足以开始推迟浏览器(特别是一些IE浏览器与BalusC在另一个问题中提到的泄漏错误?请记住,这是我的第一个javascript / java servlets项目。
是的,您当然应该担心浏览器特定的错误。你希望你的应用程序没有问题,是吗?你为什么不只使用像jQuery这样的现有ajax库?它已经为您处理了所有讨厌的错误和细节(这不仅仅是MSIE内存泄漏)。只需致电$.ajax()
,$.get()
,$.post()
或$.getJSON()
即可。当你对这些材料还不熟悉的时候,我不会尝试重新发明XHR处理轮。您可以在this answer中找到一些jQuery-Servlet通信示例。