2012-07-16 46 views
22

Tôi đã tìm kiếm stackoverflow nhưng có câu trả lời trái ngược nhau:Sử dụng lại đối tượng XMLHttpRequest hoặc tạo đối tượng mới?

Why should I reuse XmlHttpRequest objects?

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

Ngoài ra, có một đề nghị trên w3schools.com:

Nếu bạn có nhiều hơn một nhiệm vụ AJAX trên của bạn trang web, bạn nên tạo ONE chức năng tiêu chuẩn để tạo đối tượng XMLHttpRequest và gọi điều này cho mỗi tác vụ AJAX.

Tại sao đề xuất này? Tôi thay vì sử dụng một đối tượng XMLHttpRequest toàn cục trên trang của tôi để xử lý tất cả các tác vụ Ajax.

Trả lời

6

Tốt nhất là sử dụng các đối tượng khác nhau cho mỗi XHR bạn đang tạo. Ngay cả khi có một cách để làm điều đó, tránh nó! Không có vấn đề gì khi tạo đối tượng mới cho mỗi yêu cầu. Nếu bạn đang lo lắng về rò rỉ bộ nhớ hoặc một cái gì đó của loại đó, đừng lo lắng, họ là tất cả đúng GC`ed.


Nếu bạn có nhiều hơn một nhiệm vụ AJAX trên trang web của bạn, bạn nên tạo ONE chức năng tiêu chuẩn cho việc tạo đối tượng XMLHttpRequest, và gọi đây là cho mỗi công việc AJAX.

Thực tế nghĩa là bạn có một hàm tạo đối tượng mới và trả về mỗi khi bạn gọi. Nó giống như:

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

Bạn hiểu lầm khuyến nghị của W3School. Tôi sẽ làm nổi bật các phần có liên quan:

Nếu bạn có nhiều hơn một nhiệm vụ AJAX trên trang web của bạn, bạn nên tạo ONE chuẩn chức năng để tạo đối tượng XMLHttpRequest, và gọi đây là cho mỗi công việc AJAX.

Nó nói rằng bạn sử dụng một hàm AJAX để tìm nạp yêu cầu. Chức năng này sẽ xử lý các mâu thuẫn giữa IE và các trình duyệt khác. XMLHttpRequest trong trình duyệt tuân thủ tiêu chuẩn và ActiveXObject trong IE.

Tôi khuyên bạn nên sử dụng nhiều đối tượng XHR. Với một đối tượng xhr toàn cầu, ứng dụng của bạn chỉ có thể xử lý một yêu cầu tại một thời điểm nhất định. Nó cũng dễ bị lỗi (ví dụ: XMLHttpRequest launches multiple times without initiating the onreadystatechange function).

W3Schools nghĩa cái gì đó như:

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(); 

Mặc dù nó tốt hơn để tạo ra một chức năng mà xử lý yêu cầu, chẳng hạn như jQuery.ajax.

+2

Tôi nghĩ rằng anh ấy đã hiểu đề xuất khá tốt, trừ khi anh ấy chỉnh sửa câu hỏi của anh ấy kể từ đó. Trích dẫn: "Tôi * thay vào đó * bằng cách sử dụng một đối tượng * XMLHttpRequest * toàn cầu" - thay vào đó có nghĩa là trái ngược với đề xuất, rõ ràng là ông hiểu nghĩa là không phải là toàn cục duy nhất mà là nhiều trường hợp. – nafg

2

Đề xuất bạn đánh dấu là nói rằng bạn nên có một CHỨC NĂNG xử lý AJAX, thay vì cụ thể là một đối tượng XMLHTTPRequest.

Tôi sẽ sử dụng một câu hỏi khác cho mỗi câu hỏi.

Lý lẽ chung chống lại mối quan tâm này là các chi phí liên quan đến việc thiết lập XHR. Tuy nhiên, điều này sẽ không đáng kể trong bất kỳ trang web nào sử dụng AJAX như nó được dự định (nghĩa là không thay thế cho các ổ cắm web) và, trong mọi trường hợp, nhiều chi phí tương tự sẽ áp dụng với việc sử dụng lại XHR. Bạn vẫn phải mở kết nối, kích hoạt loa, đính kèm người nghe, v.v.

Trình duyệt khác nhau về số lượng cổng kết nối được cho phép tại một thời điểm nhất định, do đó, trình duyệt kiểm soát những gì XHR có thể làm . Nói cách khác, bạn không phải lo lắng về việc quản lý khía cạnh này.

Cuối cùng, không có gì ngăn bạn xóa thủ công XHR sau khi bạn đã sử dụng chúng, miễn là chúng có thể xóa (thuộc tính của đối tượng thay vì biến).

Các vấn đề liên quan