2011-01-26 12 views
5

Questi metodi che vengono in mente, quali sono i pro e i contro di ciascuno?Come posso creare un wrapper/proxy XMLHttpRequest?

Metodo 1: Aumentare esempio nativo

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; 
} 

Metodo 2: Sub "classe" XMLHttpRequest nativo

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

Metodo 3: delega completo a XMLHttpRequest nativo

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

Il tuo primo metodo mi sembra sbagliato. Temo che entrerai in un ciclo ricorsivo fino a ottenere un overflow dello stack. ;) E perché lo vuoi comunque? Esistono molte soluzioni più ordinate, che non devono fornire chiamate di funzione a un oggetto di riferimento. –

+0

Marcel: hai ragione, era un tipo, l'ho risolto. – tlrobinson

+3

ThiefMaster: la maggior parte delle mie domande non ha mai una risposta adeguata ... – tlrobinson

risposta

2

seconda sul motore JS, il metodo 1 produce un notevole overhead, dal momento che xhr.open è ridefinito ogni volta che XHR viene istanziato.

Il metodo 2 mi fa pensare "perché avresti bisogno del new _XMLHttpRequest in primo luogo"? C'è una minima sensazione di effetti collaterali indesiderati, ma sembra funzionare bene.

Metodo 3: semplice, vecchia scuola, ma non funzionerà immediatamente. (Pensa a leggere le proprietà)

In generale, sono personalmente riluttante quando si tratta di sovrascrivere gli oggetti del browser, quindi sarebbe un grosso problema con tutti e tre i metodi. Meglio usare qualche altra variabile come ProxyXHR (solo i miei 2 cent)

0

Può dipendere dal caso d'uso. Nel mio caso ho voluto creare un proxy completo che sembra essere possibile solo con il terzo metodo. Il problema è che onreadystatechange deve essere impostato sull'implementazione XHR originale. Immagino che ci siano getter e setter definiti che non possono essere cambiati dall'esterno.

A causa di questo metodo 1 e 2 non funzionerà. Per raggiungere questo obiettivo ho scritto un completo, nel senso che non ho trovato alcun bug, proxy per XHR qui: A: How can I catch and process the data from the XHR responses using casperjs?. Essa deve essere fatto con il metodo 3.

0

Utilizzare la configurazione di sotto

_XMLHTTPRequest.setProxy(proxySetting, varProxyServer, varBypassList);

Parametri dettagli: proxySetting - configurazione proxy es: SXH_PROXY_SET_DEFAULT, SXH_PROXY_SET_DIRECT, SXH_PROXY_SET_PROXY, SXH_PROXY_SET_PRECONFIG

varProxyServer - Il nome di un server proxy

varBypassList - nomi host o indirizzi IP per whi ch si desidera consentire l'esclusione del server proxy.