Attuazione della classe asincrono in Ajax

Avendo stabilito XMLHttpRequests asincrono sono la strada da percorrere, la classe Asynchronous incapsulamento è definito. Una classe di incapsulamento non è necessaria, ma rende più semplice lavorare con l'oggetto XMLHttpRequest. Il principale vantaggio di utilizzare una classe di incapsulamento è l'associazione dell'oggetto XMLHttpRequest, con un blocco di codice. Per un ripasso, diamo un'occhiata al codice per caricare un feed Atom di nuovo:

LoadAtomFeed function () (var asincrona = Asynchronous new (); asynchronous.settings = (onComplete: function (xmlhttp) (parseAtom (xmlhttp.responseXML); flexbox.update ();)) asynchronous.get ( "/ servizi / blog / entries / current ");)
  

Per rendere il lavoro asincrono classe, l'utente deve fare due cose: associare il membro impostazioni di dati con alcune informazioni e chiamare un metodo appropriato (per esempio, ottenere) di effettuare una richiesta HTTP. Lo scopo del membro impostazioni dei dati è quello di fornire i richiami e le informazioni extra associate a una richiesta. In questo esempio, il metodo onComplete viene chiamato una volta la richiesta HTTP è stata completata.

Il codice così com'è è abbastanza facile da capire, ma ricordo che il codice è asincrona. Di conseguenza, quando il metodo asynchronous.get viene chiamato, la funzione LoadAtomFeed uscirà prima di chiamare onComplete e di restituire il controllo per l'utente. In uno scenario peggiore, se un utente va click-pazza, ci potrebbero essere decine di richieste in corso. L'alternativa è quella di utilizzare le chiamate sincrone, che bloccano il browser, e che la stessa non è un'opzione. Sul lato positivo, il comportamento asincrono consente a un utente di avviare le attività e attendere i risultati. Il programmatore deve rimanere vigile e assicurarsi che l'utente non andare avanti a lui o lei. Ora che avete una conoscenza di base su come utilizzare la classe asincrono, vediamo i dettagli della realizzazione asincrona. La classe espone un metodo per ogni verbo HTTP, e l'esempio il metodo GET corrisponde al verbo HTTP GET. L'attuazione di ottenere è il seguente:

funzione HttpRequest_get (strURL) (this.call ((action: "GET", url: strURL));)

Per l'attuazione del HttpRequest_get, che si associa a Asynchronous.get, un riferimento alla chiamata di funzione è fatto. La funzione get è un metodo comodo per il metodo di chiamata. La chiamata al metodo accetta un unico parametro: un oggetto con i membri di dati specifici. Nel caso del metodo GET, l'azione e l'URL membri di dati sono definiti. Allora perché creare un oggetto, quando si potrebbe avere utilizzato due parametri, l'azione e l'URL, per la chiamata di metodo? La risposta è la flessibilità. Javascript non comprende funzioni di sovraccarica, e non ci può essere solo una singola funzione di un unico insieme di parametri. In modo che lo sviluppatore non ha bisogno di giocare le permutazioni e le combinazioni di gioco con i parametri (ad esempio, che i parametri, quale ordine, ecc), un oggetto con i membri di dati viene creato.

Il metodo più importante di asincrona è chiamata, perché a prescindere da quale verbo HTTP viene utilizzato, il metodo viene eseguito. Il seguente codice è l'attuazione completa della chiamata.

 Fonte: 

Io ora spiegare il metodo di chiamata, dall'inizio alla fine, e io ribadisco i singoli pezzi di codice, con alcune reiterazioni abbreviato. I Mostra di nuovo il codice, se del caso per la facilità di comprensione, l'attuazione della chiamata è relativamente lungo e fa molte cose diverse. Partendo dall'alto, la variabile di istanza è assegnato al valore di questo: ad esempio var = this; Questa assegnazione è necessario perché un blocco di codice verrà assegnato al membro onreadystatechange dati, e il blocco di codice deve ricordare che ad esempio asincrono si fa riferimento. Dopo l'assegnazione, controlliamo che il membro impostazioni dei dati è stata popolata:

if (! this.settings) (throw new Error ( "Impostazioni" non è definita ");)

Il membro impostazioni dati deve esistere perché contiene informazioni sui metodi di chiamare quando la richiesta è stata completata e che le intestazioni HTTP per aggiungere alla richiesta. A questo punto, si dovrebbe notare che due oggetti sono necessari per far funzionare il metodo di chiamata. Il primo oggetto è impostazioni, e il secondo oggetto è il parametro di richiesta. Come scorciatoia, uno sviluppatore potrebbe combinare i due oggetti in uno, e sia passarlo al metodo di chiamata o assegnarlo al membro impostazioni dei dati. Questo collegamento potrebbe essere fuorviante, perché ogni oggetto ha un diverso scopo.

L'oggetto richiesta è utilizzato per definire le impostazioni per la richiesta di URL specifico in corso. Le impostazioni di oggetto è utilizzato per definire le impostazioni che trascendono tutte le chiamate e potrebbe essere un considerato un callback globale per l'istanza Asynchronous oggetto. L'idea è quella di allocare un 'istanza di asincrona, definisce come dovrebbe comportarsi, e poi iniziare a fare le richieste con la possibilità di chiamare URL diversi. Allora il passo successivo è quello di verificare che l'istanza XMLHttpRequest corrente non è già preoccupato:

if (this.xmlhttp.readyState! = 4 & & this.xmlhttp.readyState! = 0) (throw new Error ( "richiesta Attualmente attiva non può continuare");)
 

Quando si utilizza XMLHttpRequest in modalità asincrona, è possibile effettuare una richiesta HTTP nuovo su un'istanza XMLHttpRequest esecuzione. Il problema è che XMLHttpRequest non può servire due richieste, e si fermerà la richiesta di esecuzione già a fare una nuova richiesta. La proprietà readyState è usato per indicare lo stato dell'oggetto XMLHttpRequest. Se readyState è 0, allora nessuna richiesta è stata presentata una richiesta HTTP e può essere fatta. Se readyState è 4, allora la richiesta è stata fatta, la richiesta è stata completata, e l'oggetto è pronto a fare un'altra richiesta. Se readyState ha un altro valore, la richiesta è in esecuzione, e quindi l'esecuzione di un'altra domanda non ha senso. Dopo l'inizializzazione e il controllo è stato completato, è possibile fare una richiesta: this.xmlhttp.open (request.action, richiesta . url, true, this.settings.username, this.settings.password); La chiamata al metodo aperto, è necessario specificare a aminimum il verbo HTTP (ad esempio, GET, POST) tramite il membro request.action dati e l'URL via il membro dati request.url. Ogni volta che si effettua ogni richiesta XMLHttpRequest, assicurarsi che la prima azione è il metodo aperto. Se si assegna la funzione onreadystatechange prima di chiamare aperta, la tua richiesta non funzionerà correttamente. Se si tenta di assegnare le intestazioni delle richieste prima di chiamare aperta, la tua richiesta non funzionerà correttamente. Il metodo aperto viene utilizzato per inizializzare e creare una nuova richiesta, non verrà aperto chiamare il server, in quanto tale è la responsabilità di inviare.

Nell'esempio metodo aperto, un nome utente e la password (this.settings.username e this.settings.password, rispettivamente) sono sempre inviati al server, anche se non vi è alcun nome utente e password. E non fa male a inviare i valori null, e non influirà sul funzionamento di una richiesta HTTP. Il nome utente e la password vengono utilizzati solo quando il server HTTP esegue una sfida e chiede un nome utente e password. Nel contesto dell'oggetto XMLHttpRequest, il nome utente e la password vengono utilizzati solo se l'implementazione sottostante di XMLHttpRequest bisogno delle informazioni. Dopo aver aperto la richiesta, è possibile aggiungere intestazioni HTTP personalizzato utilizzando il metodo setRequestHeaders:

if (request.headers) (for (defHeader in request.headers) (this.xmlhttp.setRequestHeader (defHeader, request.headers [defHeader]);)) if (this.settings.headers) (for (defHeader in this.settings . headers) (this.xmlhttp.setRequestHeader (defHeader, this.settings.headers [defHeader]);))

Le intestazioni vengono assegnati due volte: una volta per le impostazioni associate alla richiesta (request.headers) e una volta per le impostazioni globali (this.settings.headers). Le intestazioni che si assegna può essere intestazioni HTTP standard o le intestazioni personalizzate. Se si pensa di utilizzare le intestazioni HTTP personalizzato, è sempre una buona idea prefisso con X-. In questo modo, le intestazioni non possa essere confuso con intestazioni HTTP standard. Dopo aver assegnato le intestazioni, la funzione di callback onreadystatechange viene assegnato:

this.xmlhttp.onreadystatechange = function () (switch (instance.xmlhttp.readyState) (case 1: if (instance.settings.onLoading) (instance.settings.onLoading (instance.xmlhttp);) break; case 2: if ( instance.settings.onLoaded) (instance.settings.onLoaded (instance.xmlhttp);) break; case 3: if (instance.settings.onInteractive) (instance.settings.onInteractive (instance.xmlhttp);) break; case 4: if (instance.settings.onComplete) (try (instance.settings.onComplete (instance.xmlhttp);) catch (e) (globals.errorHandler break (e);));)

Per l'attuazione di Asynchronous onreadystatechange, un'istruzione switch esegue uno dei quattro valide stati pronti. Dalla sorgente, è possibile associare ogni numero con uno stato specifico. Lo stato più importante pronti è pari a 4, indica che il contenuto è stato recuperato, caricati e trattati. Lo stato 4 ready chiama il metodo definito dal cliente nelle impostazioni delle proprietà. Avviso per l'attuazione della funzione assegnata onreadystatechange che la variabile di istanza ha sostituito un riferimento alla presente.

L'attuazione della funzione onreadystatechange è eccessivo, come il 98% del tempo di utilizzo di Asynchronous si cura solo circa lo stato di pronto 4. Per tutti gli altri stati pronti, a seconda del browser, alcune funzionalità è possibile. A causa di questa incoerenza e l'incompletezza dello stato dell'oggetto XMLHttpRequest, non vi è alcuna reale necessità di elaborare gli altri stati pronti. Il resto del codice chiamata di funzione comporta l'invio della richiesta al server utilizzando la funzione Invia:

try (this.xmlhttp.send (request.data);) catch (e) (globals.errorHandler (e);)

Il inviare funzione viene utilizzata per effettuare la richiesta al server fisico. La funzione è inoltre utilizzato per inviare tutti i dati associati con la richiesta. Se non ci sono dati, quindi chiamare invia con il valore null non genererà un errore. Quando il metodo Send ha fatto la sua richiesta, ritorna immediatamente, e la funzione JavaScript Asynchronous_call restituirà il controllo al browser. In questo momento, il cliente deve aggiungere il codice per non consentire le chiamate multiple. Ad esempio, se la richiesta è stato attivato tramite il pulsante, quindi fino a quando la richiesta è tornato, il pulsante potrebbe essere disabilitato. Naturalmente, questo introduce un potenziale problema se la richiesta non ritorna mai e il pulsante rimane disattivato. Per risolvere questo problema, è possibile introdurre un timer che consente la richiesta di un importo massimo di tempo. Se durante tale periodo, la domanda non ha ancora restituito, il metodo XMLHttpRequest.abort si chiama e il pulsante è attivato di nuovo.

un articolo presentato da Sonja Lande


Disclaimer:Il nostro sito non è responsabile per il contenuto di questo articolo. Webarticles è una risorsa gratuita di informazioni.
Importante: Questo articolo "Attuazione della classe Asynchronous in Ajax" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.


Online: 481 users browsing the articles directory