2011-01-26 36 views
5

Những phương pháp này đến với tâm trí, những ưu và khuyết điểm của mỗi phương pháp là gì?Làm cách nào để tạo trình bao bọc/proxy XMLHttpRequest?

Phương pháp 1: Tăng thêm dụ mẹ đẻ

var _XMLHttpRequest = XMLHttpRequest; 
XMLHttpRequest = function() { 
    var xhr = new _XMLHttpRequest(); 

    // augment/wrap/modify here 
    var _open = xhr.open; 
    xhr.open = function() { 
     // custom stuff 
     return _open.apply(this, arguments); 
    } 

    return xhr; 
} 

Cách 2: Chi "class" XMLHttpRequest mẹ đẻ

var _XMLHttpRequest = XMLHttpRequest; 
XMLHttpRequest = function() { 
    // definePropertys here etc 
} 

XMLHttpRequest.prototype = new _XMLHttpRequest()); 
// OR 
XMLHttpRequest.prototype = Object.create(_XMLHttpRequest); 

// custom wrapped methods on prototype here 
XMLHttpRequest.prototype.open = function() { 
    // custom stuff 
    return _XMLHttpRequest.prototype.open.apply(this, arguments); 
} 

Phương pháp 3: Toàn proxy để XMLHttpRequest mẹ đẻ

var _XMLHttpRequest = XMLHttpRequest; 
XMLHttpRequest = function() { 
    this.xhr = new _XMLHttpRequest(); 
} 

// proxy ALL methods/properties 
XMLHttpRequest.prototype.open = function() { 
    // custom stuff 
    return this.xhr.open.apply(this.xhr, arguments); 
} 
+0

Phương pháp đầu tiên của bạn có vẻ sai với tôi. Tôi lo sợ bạn sẽ nhận được trong một vòng lặp đệ quy cho đến khi bạn nhận được một Stack Overflow. ;) Và tại sao bạn muốn điều này không? Có rất nhiều giải pháp neater, mà không cần phải cung cấp các cuộc gọi hàm tới một đối tượng được tham chiếu. –

+0

Marcel: bạn nói đúng, đó là một kiểu, tôi đã sửa nó. – tlrobinson

+3

ThiefMaster: hầu hết các câu hỏi của tôi không bao giờ được trả lời đầy đủ ... – tlrobinson

Trả lời

2

Tuỳ trên động cơ JS, phương pháp 1 tạo ra chi phí đáng kể, vì xhr.open là định nghĩa lại bất cứ khi nào XHR được khởi tạo.

Phương pháp 2 khiến tôi nghĩ "tại sao bạn cần số new _XMLHttpRequest ngay từ đầu"? Có một cảm giác nhỏ của tác dụng phụ không mong muốn, nhưng nó có vẻ hoạt động tốt.

Phương pháp 3: đơn giản, trường học cũ, nhưng nó sẽ không hoạt động ngay lập tức. (Hãy suy nghĩ về các thuộc tính đọc)

Nói chung, cá nhân tôi miễn cưỡng khi nói đến việc ghi đè đối tượng trình duyệt, vì vậy đó sẽ là một con lớn cho cả ba phương pháp. Sử dụng tốt hơn một số biến khác như ProxyXHR (chỉ 2 xu của tôi)

0

Nó có thể phụ thuộc vào trường hợp sử dụng. Trong trường hợp của tôi, tôi muốn tạo một proxy hoàn chỉnh mà dường như chỉ có thể với phương thức thứ ba. Vấn đề là onreadystatechange cần được đặt trên triển khai XHR gốc. Tôi đoán có getter và setter xác định rằng không thể thay đổi từ bên ngoài.

Do phương pháp này 1 và 2 sẽ không hoạt động. Để đạt được điều này tôi đã viết một hoàn thành, có nghĩa là tôi đã không tìm thấy bất kỳ lỗi, proxy để XHR ở đây: A: How can I catch and process the data from the XHR responses using casperjs?. Nó cần phải được thực hiện với phương pháp 3.

0

Sử dụng cấu hình bên dưới

_XMLHTTPRequest.setProxy(proxySetting, varProxyServer, varBypassList);

Các thông số chi tiết: proxySetting - cấu hình proxy ví dụ: SXH_PROXY_SET_DEFAULT, SXH_PROXY_SET_DIRECT, SXH_PROXY_SET_PROXY, SXH_PROXY_SET_PRECONFIG

varProxyServer - Tên của máy chủ proxy

varBypassList - tên máy chủ hoặc địa chỉ IP cho whi bạn muốn cho phép bỏ qua máy chủ proxy.

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