2012-07-16 111 views
22

我搜索计算器,但得到的回答自相矛盾:重用XMLHttpRequest对象还是创建一个新对象?

Why should I reuse XmlHttpRequest objects?

Ajax-intensive page: reuse the same XMLHttpRequest object or create new one every time?

此外,还有上w3schools.com的建议:

如果你有一个以上的AJAX你的任务网站,您应该创建 ONE标准函数用于创建XMLHttpRequest对象,并且针对每个AJAX任务调用 。

为什么这个建议?相反,我在页面上使用全局XMLHttpRequest对象来处理所有Ajax任务。

回答

6

最好为您制作的每个XHR使用不同的对象。即使有办法,避免它!为每个请求创建新对象没有问题。如果你担心内存泄漏或类似的问题,不要担心,它们都是正确的GC。


如果您的网站上有一个以上的AJAX任务,你应该创建一个标准函数用于创建XMLHttpRequest对象,并称之为每个AJAX任务。

它实际上意味着您有一个函数可以创建一个新对象,并在您每次调用它时返回它。它类似于:

function newXHR(){ 
    return a new instance of XHR(); 
} 
13

您误解了W3School的建议。我还是要强调的相关部分:

如果您的网站上有一个以上的AJAX任务,你应该为创建XMLHttpRequest对象创建ONE标准功能,并称之为每个AJAX任务。

它说你使用一个AJAX函数来获取请求。此功能将处理IE和其他浏览器之间的不一致性。在符合标准的浏览器中为XMLHttpRequest,在IE中为ActiveXObject

我推荐使用多个XHR对象。使用一个全局xhr对象,您的应用程序只能在给定时间处理一个请求。它也容易出错(例如XMLHttpRequest launches multiple times without initiating the onreadystatechange function)。

W3Schools的意思大概是:

function createXHR() { 
    try { 
     return new XMLHttpRequest(); 
    } catch (e) { 
     try { 
      return new ActiveXObject("Microsoft.XMLHTTP"); 
     } catch (e) { 
      return new ActiveXObject("Msxml2.XMLHTTP"); 
     } 
    } 
} 
var xhr = createXHR(); 
xhr.open('get', '/test', true); 
xhr.send(); 

虽然这是更好地创建其处理请求的功能,如jQuery.ajax

+2

我想他很理解这个建议,除非他从那时起编辑他的问题。 Quote:“我*而不是*使用*全球* XMLHttpRequest对象” - 而不是意味着建议,这显然他理解为不是一个单一的全球,而是多个实例。 – nafg 2013-06-05 06:42:32

2

您强调的建议是说您应该有一个处理AJAX的FUNCTION,而不是特定的一个XMLHTTPRequest对象。

我会为每个问题使用不同的一个。

反对这个问题的常见论点涉及设置XHR所涉及的开销。然而,在任何使用AJAX的网站中,这个数字几乎可以忽略不计(即不能作为Web套接字的劳动替代品),并且在任何情况下,重复使用XHR都会产生相同的开销。您仍然必须打开连接,启动它,附加听众等。

浏览器在给定时间允许连接网关的数量有所不同,因此浏览器需要控制XHR可以执行哪些操作。换句话说,您不必担心管理这方面的问题。

最后,没有什么能阻止你在使用它们之后手动删除XHRs,只要它们是可删除的(对象的属性而不是变量)。

相关问题