2012-07-16 116 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,只要它們是可刪除的(對象的屬性而不是變量)。