Die Umsetzung der Asynchron-Klasse in Ajax

Nach asynchronen XMLHttpRequest sind entschlossen, den Weg zu gehen, ist die Verkapselung Asynchron-Klasse definiert. Eine Kapselung Klasse ist nicht notwendig, aber es macht es einfacher, mit dem XMLHttpRequest-Objekt zu arbeiten. Der wesentliche Vorteil der Verwendung eines Kapselung Klasse ist die Vereinigung des XMLHttpRequest-Objekts mit einem Code-Block. Für eine Auffrischung, lassen Sie uns den Code Blick auf ein Atom-Feed erneut zu laden:

Funktion LoadAtomFeed () (var asynchronen = new Asynchronous (); asynchronous.settings = (onComplete: function (xmlhttp) (parseAtom (XMLHTTP.responseXML); flexbox.update ();)) asynchronous.get ( "/ services / blog / Einträge / current ");)
  

Um die asynchrone Klasse funktioniert, muss der Benutzer zwei Dinge tun: die Daten werden assoziiertes Mitglied mit einigen Informationen und rufen Sie eine geeignete Methode (zB bekommen), um eine HTTP-Anfrage zu machen. Der Zweck, die Daten Mitgliedes ist es, die Rückrufe und zusätzliche Informationen mit einem Antrag verbundene Dienstleistungen zu erbringen. Im Beispiel ist die onComplete Methode aufgerufen, wenn der HTTP-Anforderung abgeschlossen ist.

Der Code in ihrer jetzigen Form ist ziemlich einfach zu verstehen, aber denken Sie daran, dass der Code asynchron sein soll. Als Ergebnis, wenn die asynchronous.get Methode aufgerufen wird, die LoadAtomFeed Funktion wird vor dem Aufruf onComplete und die Kontrolle an den Benutzer-Exit. In einem Worst-Case-Szenario, wenn ein Benutzer geht Klick-verrückt, könnte es Dutzende von Anträgen erzielt. Die Alternative ist, synchrone Aufrufe, die die Browser-Schloss, die Verwendung und die selbst keine Option. Auf der positiven Seite, ermöglicht asynchrones Verhalten eines Benutzers, um Aufgaben zu starten und warten auf die Ergebnisse. Der Programmierer muss wachsam bleiben und dafür sorgen, dass der Benutzer nicht vor ihm oder sich. Nun, da Sie ein grundlegendes Verständnis, wie die asynchrone Klasse zu verwenden, lassen Sie uns die Details der Umsetzung Asynchronous haben. Die Klasse stellt eine Methode für jede HTTP-Verb, in der beispielsweise die GET-Methode entspricht dem HTTP-Verb GET. Die Umsetzung von get ist wie folgt:

Funktion HttpRequest_get (strUrl) (this.call ((Aktion: "GET", url: strURL));)

Bei der Durchführung des HttpRequest_get, die Asynchronous.get, einen Verweis auf die Funktion aufrufen zugeordnet ist erfolgt. Die get-Funktion ist eine bequeme Methode, um den Anruf-Methode. Der Aufruf Methode akzeptiert einen einzelnen Parameter: ein Objekt mit Daten Mitglieder. Bei der GET-Methode werden die Maßnahmen und url Datenelemente definiert. Also, warum ein Objekt erstellen, wenn Sie zwei Parameter, Action und url, hätte für den Methodenaufruf verwendet? Die Antwort lautet: Flexibilität. JavaScript nicht versteht überladenen Funktionen, und es kann nur eine einzige Funktion mit einem einzigen Satz von Parametern. So dass die Entwickler nicht an die Permutationen und Kombinationen Spiel mit den Parametern spielen (z. B., welche Parameter in welcher Reihenfolge, etc.), ist ein Objekt mit Daten Mitgliedern erstellt wurden.

Die wichtigste Methode der asynchronen ist zu nennen, weil unabhängig davon, welches HTTP-Verb verwendet wird, ist die Methode ausgeführt. Der folgende Code ist die vollständige Umsetzung des Anrufs.

 Quelle: 

Ich werde jetzt erklären, die call-Methode von Anfang bis Ende, und ich werde die einzelnen Stücke wiederholen Code, mit einigen Wiederholungen verkürzt. Ich zeige den Code erneut ein gegebenenfalls zum besseren Verständnis, wie die Durchführung des Anrufs ist relativ lang und hat viele verschiedene Dinge. Beginnend an der Spitze, ist die Instanz-Variable, die diesen Wert zugewiesen: var instance = this; Diese Zuordnung ist notwendig, weil ein Code-Block wird auf die onreadystatechange Datenelement zugeordnet werden, und der Code-Block hat, auf welche Asynchronous Instanz, auf die verwiesen erinnern. Nach der Zuweisung wir überprüfen, ob die Einstellungen Daten Mitglied wurde gefüllt:

if (! this.settings) (throw new Error ( "Einstellungen" ist nicht definiert ");)

Die Einstellungen Daten Mitglied hat zu existieren, weil es Informationen darüber, welche Methoden aufrufen, um, wenn der Antrag und die das HTTP-Header, um den Antrag auf Hinzufügung enthält. An diesem Punkt sollten Sie beachten, dass zwei Objekte erforderlich sind, um den Anruf Methode funktioniert. Das erste Objekt ist, Einstellungen und das zweite Objekt ist der Request-Parameter. Als Abkürzung könnte ein Entwickler die beiden Objekte zu einem zu kombinieren, und entweder passen, um den Anruf oder weisen Sie es Methode, um die Einstellungen Daten Mitglied. Diese Verknüpfung wäre abwegig, denn jedes Objekt einen anderen Zweck hat.

Das Request-Objekt wird verwendet, um die Einstellungen für die jeweilige URL-Anforderung definiert wird, die gemacht. Die Einstellungen Objekt wird verwendet, um die Einstellungen zu definieren, dass alle Anrufe zu überschreiten und könnte als eine globale Rückruf für die asynchrone Objektinstanz. Die Idee ist, dass Sie eine Instanz von Asynchronous zuzuweisen, definieren, wie sie sich verhalten sollten, und dann beginnen Sie, Anträge mit der Möglichkeit des Anrufers unterschiedlichen URLs. Dann ist der nächste Schritt, um zu überprüfen, dass die derzeitige XMLHttpRequest-Instanz nicht bereits beschäftigt:

if (this.xmlhttp.readyState! = 4 & & this.xmlhttp.readyState! = 0) (throw new Error ( "Zur Zeit aktive Anfrage kann nicht fortgesetzt werden");)
 

Bei der Verwendung von XMLHttpRequest im asynchronen Modus ist es möglich, einen neuen HTTP-Anfrage auf eine Ausführung XMLHttpRequest-Instanz zu machen. Das Problem ist, dass nicht zwei XMLHttpRequest-Anfragen zu bedienen können, und es wird die Ausführung bereits auf, einen neuen Antrag stellen zu stoppen. Die readyState Eigenschaft wird verwendet, um den Zustand des XMLHttpRequest-Objekts anzuzeigen. Wenn readyState 0 ist, dann kein Antrag gestellt wurde und eine HTTP-Anfrage gemacht werden können. Wenn readyState ist 4, dann ein Antrag gestellt wurde, hat die Anforderung abgeschlossen, und das Objekt bereit ist, zu einem anderen Antrag zu stellen. Wenn readyState einen anderen Wert hat, ist ein Antrag bereits ausgeführt, und damit eine weitere Anfrage der Ausführung nicht sinnvoll. Nach der Initialisierung und Überprüfung abgeschlossen ist, ist es möglich, einen Antrag zu machen: this.xmlhttp.open (request.action anfordern . url, true, this.settings.username, this.settings.password); Aufruf des offenen, müssen Sie bei Minimalbestellfrist das HTTP-Verb angegeben (z. B. GET, POST) über die request.action Datenelement und die URL, über die Daten request.url Mitglied. Wenn Sie irgendwelche XMLHttpRequest Antrag zu stellen, stellen Sie sicher, dass die erste Aktion der offenen Methode ist. Wenn Sie die innerhalb der Funktion zuweisen vor dem Aufruf zu öffnen, wird Ihre Anfrage nicht richtig funktionieren. Wenn Sie versuchen, Request-Header vor dem Aufruf von open zuweisen, wird Ihre Anfrage nicht ordnungsgemäß. Die offene Methode wird verwendet, um zu initialisieren, und erstellen Sie eine neue Anfrage, öffnet sich der Server nicht nennen, denn das liegt in der Verantwortung zu senden.

In der offenen beispielsweise einen Benutzernamen und ein Passwort (this.settings.username und this.settings.password, respectively) sind immer an den Server gesendet, auch wenn es keinen Benutzernamen und Passwort ein. Es schadet nicht, um NULL-Werte zu senden, und es wird keine Auswirkungen auf den Betrieb eines HTTP-Request. Der Benutzername und das Passwort werden nur verwendet, wenn der HTTP-Server führt eine Herausforderung und verlangt einen Benutzernamen und ein Passwort. Im Rahmen des XMLHttpRequest-Objekts, den Benutzernamen und das Passwort verwendet werden, wenn die zugrunde liegende Implementierung von XMLHttpRequest den Informationsbedarf. Nachdem Sie die Anfrage geöffnet haben, können Sie benutzerdefinierte HTTP-Header mit dem setRequestHeaders Methode hinzufügen:

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

Die Header zugeordnet sind zweimal: einmal für die Einstellungen mit der Anfrage (request.headers) und einmal für die globalen Einstellungen (this.settings.headers) verbunden sind. Die Header, die Sie zuweisen können Standard-HTTP-Header oder benutzerdefinierte Header. Wenn Sie mithilfe von benutzerdefinierten HTTP-Header planen, ist es immer eine gute Idee, sie mit X-Präfix. Auf diese Weise wird die Header nicht mit Standard-HTTP-Header verwechselt werden. Nachdem Sie die Header zugeordnet haben, ist die onreadystatechange Callback-Funktion zugewiesen:

this.xmlhttp.onreadystatechange = function () (switch (instance.xmlhttp.readyState) (case 1: if (instance.settings.onLoading) ((instance.xmlhttp);) break; case 2: instance.settings.onLoading 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 (e);)) break;)

In der Asynchronous Durchführung onreadystatechange, führt eine switch-Anweisung eines der vier gültigen bereit Staaten. Von der Quelle können Sie jede Zahl mit einem bestimmten Staat zugeordnet werden. Die wichtigsten Staat ist bereit, 4, mit Angabe, dass der Inhalt abgerufen worden ist, geladen und bearbeitet werden. Das 4-Status "ready" ruft die Methode durch den Kunden in den Einstellungen definierte Eigenschaft. Beachten Sie bei der Umsetzung der zugeordneten innerhalb der Funktion, dass die Instanz-Variable ist ein Verweis auf diese ersetzt.

Die Umsetzung der innerhalb der Funktion ist übertrieben, da 98% der Zeit, die Sie verwenden Asynchronous Sie nur über den Status "Bereit" vom 4. Pflege. Für alle anderen Staaten bereit, je nach Browser, bestimmte Funktionen ist möglich. Wegen dieser Unstimmigkeiten und die Unvollständigkeit des XMLHttpRequest-Objekts Staat, gibt es keine wirkliche Notwendigkeit, die anderen Staaten bereit Prozess. Die restlichen call function-Code ist das Senden der Anforderung an den Server senden mit der Funktion:

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

Die Sende-Funktion wird verwendet, um die körperliche Anforderung an den Server zu machen. Die Funktion wird auch benutzt, um alle Daten mit dem Antrag verbunden zu senden. Wenn es keine Daten, dann senden Sie fordern mit Null-Wert wird nicht erzeugt einen Fehler. Wenn die Methode senden Sie hat ihren Antrag gestellt hat, gibt es sofort, und die JavaScript-Funktion Asynchronous_call wird die Kontrolle an den Browser zurück. Zu diesem Zeitpunkt sollte der Kunde einige Code hinzufügen, um nicht zulassen, dass mehrere Anrufe. Zum Beispiel, wenn der Antrag mit der Taste aktiviert wurde, dann, bis der Antrag zurück, konnte die Schaltfläche deaktiviert werden. Natürlich stellt dies ein potenzielles Problem, wenn der Antrag nicht zurück und bleibt die Schaltfläche deaktiviert. Um dieses Problem zu lösen, können Sie die Einführung eines Timers, dass der Antrag ergibt sich eine maximale Höhe der Zeit. Wenn während dieser Zeit, den Antrag noch nicht zurückgekehrt, die XMLHttpRequest.abort Methode wird aufgerufen, und die Taste wieder aktiviert.

Ein Artikel eingereicht von Sonja Lande


Disclaimer:Unsere Website ist nicht verantwortlich für den Inhalt dieses Artikels. Webarticles ist eine kostenlose Informationsquelle.
Wichtig: Dieser Artikel "Umsetzung des Asynchron-Klasse in Ajax" wurde durch ein automatisches Software übersetzt. Wir fühlen uns leid für alle Rechtschreibfehler, die möglicherweise aufgetreten sind. Vielen Dank für Ihr Verständnis.


Online: 429 users browsing the articles directory