Ajax密集型页面:每次重复使用相同的XMLHttpRequest对象还是创建新的对象?

6

我正在开发一种在线多用户编辑器/合作界面,它将在一个页面生命周期内进行大量(数千次)的ajax请求。

哪种方法最好:(从稳定性、兼容性、避免麻烦等方面考虑)

  1. 创建一个XMLHttpRequest对象,并重复使用它来进行每个HTTP请求

  2. 为每个HTTP请求创建一个新的XMLHttpRequest对象

  3. 管理一个动态的XMLHttpRequest对象池,在开始HTTP请求时创建一个新的对象并标记先前创建的对象为“可用”,当其上一个请求成功完成时

我认为1不是一个选项,因为有些请求可能会失败,我可能在前一个请求尚未完成时启动新的请求等等。

至于2,我想这是一个内存泄漏,或者可能导致疯狂的内存/资源使用。或者我可以在请求完成时关闭或删除对象吗?(在哪里/如何?)或者JS垃圾回收器是否可以正确地自行处理?

以前从未尝试过3,但感觉像两全其美的选择。或者像那样的方法是不必要的,或者我仍然缺少潜在问题?我应该在什么时候假设请求已经完成(因此,对象可用于新请求),即在接收到readyState 4和http状态200时吗?(我可以确定在此之后不会再有更新或回调了吗?)


请问您计划使用什么服务器和互联网连接来运行此脚本?如果您的请求数量正确,并且达到数千个请求,那么该脚本将会消耗极高的资源。 - gabeio
我有一台强大的专用服务器可供使用。但预计只会在几个小时内执行数千个请求,而不是每秒钟一个请求。更像是每分钟几个请求,但可能会持续多个小时。 - Sheldon Pinkman
啊,好吧,如果你需要更快的速度,比如每秒一个请求,我建议使用Flash或Java小程序,但JavaScript也可以胜任。 - gabeio
1个回答

3

需要时创建新的对象。一旦不再需要旧对象,GC 就会处理它们。

然而,对于像协作编辑器这样的应用,您可能希望考虑使用 WebSocket 而不是一直发送请求。小型 HTTP 请求的开销巨大,而 WebSocket 连接几乎没有开销。


谢谢,我现在会选择简单的方法(每次创建一个新对象)并且也会研究WebSockets。只是为了确认一下,你是指新的HTML5 JavaScript WebSocket吗? - Sheldon Pinkman
1
是的,可能需要使用像 socket.io 这样的库来自动处理必要的 XHR 回退。 - ThiefMaster
啊,以前从没听说过,谢谢!不过有一件事,在http://socket.io/的代码示例中似乎使用了JavaScript代码服务器端?是谁或什么来执行那段代码呢? - Sheldon Pinkman
我已经编写了 HLL(高级逻辑)WebSocket服务器,这意味着我可以随时以任何方式使用WebSocket。(微笑)我目前还没有使用它们连接浏览器,因为 Microsoft 正在拖延进展。他们只支持到 MSIE v10(可能还不够完善)......上次我检查时,您只能在 Windows 8 上获取它。但我很期待。 - Roger F. Gay
你能详细说明一下“overhead”吗?你是指网络带宽、延迟、内存、CPU等方面吗? - nafg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接