Implémentation de la classe asynchrone à Ajax

Ayant déterminé XMLHttpRequests asynchrones sont la voie à suivre, la classe d'encapsulation asynchrone est définie. Une classe d'encapsulation n'est pas nécessaire, mais elle rend plus simple de travailler avec l'objet XMLHttpRequest. Le principal avantage d'utiliser une classe d'encapsulation est l'association de l'objet XMLHttpRequest avec un bloc de code. Pour une remise à niveau, nous allons regarder le code pour charger un flux Atom encore:

LoadAtomFeed fonction () (var = asynchrone asynchrone new (); asynchronous.settings = (onComplete: function (xmlhttp) (parseAtom (xmlhttp.responseXML); flexbox.update ();)) asynchronous.get ( "/ services / blog / entrées / current ");)
  

Pour rendre le travail en classe asynchrone, l'utilisateur doit faire deux choses: d'associer les membres des paramètres de données avec des informations et appeler une méthode appropriée (par exemple, get) pour faire une requête HTTP. Le but de membres des paramètres de données est de fournir les rappels et des informations supplémentaires liés à une demande. Dans l'exemple, la méthode onComplete est appelé une fois la requête HTTP est terminée.

Le code tel qu'il est est assez facile à comprendre, mais rappelez-vous que le code est asynchrone. En conséquence, lorsque la méthode asynchronous.get est appelée, la fonction LoadAtomFeed fera quitter avant d'appeler onComplete et rendre le contrôle à l'utilisateur. Dans le pire des cas, si un utilisateur va cliquer-fou, il pourrait y avoir des dizaines de demandes en cours. L'alternative consiste à utiliser des appels synchrones, qui verrouillent le navigateur, et que lui-même n'est pas une option. Sur le plan positif, le comportement asynchrone permet à un utilisateur de lancer des tâches et d'attendre les résultats. Le programmeur dispose de rester vigilants et faire en sorte que l'utilisateur ne reçoit pas en avant de lui-même. Maintenant que vous avez une connaissance de base de la façon d'utiliser la classe asynchrone, nous allons regarder les détails de l'exécution asynchrone. La classe expose une méthode pour chaque verbe HTTP, et dans l'exemple de la méthode GET correspond au verbe HTTP GET. La mise en œuvre de get est comme suit:

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

Dans la mise en œuvre de HttpRequest_get, ce qui est mappé à Asynchronous.get, une référence à l'appel de fonction est faite. L'EEG fonction est une méthode bien pratique à la méthode d'appel. L'appel de méthode accepte un seul paramètre: un objet avec les membres de données spécifiques. Dans le cas de la méthode GET, l'action et l'url membres de données sont définis. Alors pourquoi créer un objet, alors que vous pourriez avoir utilisé deux paramètres, l'action et url, pour l'appel de méthode? La réponse est la flexibilité. JavaScript ne comprennent pas les fonctions surchargées, et il peut y avoir qu'une seule fonction à un ensemble unique de paramètres. Alors que le développeur n'a pas à jouer les permutations et les combinaisons de jeu avec les paramètres (par exemple, des paramètres, quel ordre, etc), un objet avec les membres de données est créée.

La méthode la plus importante de asynchrone est d'appeler, parce que quel que soit le verbe HTTP est utilisé, la méthode est exécutée. Le code suivant est la mise en œuvre complète de l'appel.

 Source: 

Je vais maintenant vous expliquer la méthode d'appel de bout en bout, et je vais répéter les morceaux de code individuel, avec quelques réitérations abrégée. Je montre à nouveau le code, le cas échéant pour faciliter la compréhension, comme la mise en œuvre de l'appel est relativement longue et fait beaucoup de choses différentes. Commençant par le haut, la variable d'instance est affectée à la valeur de celle-ci: par exemple var = this; Cette cession est nécessaire parce qu'un bloc de code sera attribué au membre de données onreadystatechange, et le bloc de code doit se rappeler quelle instance asynchrone est référencé. Après la cession, nous validons que le membre de paramètres de données a été remplie:

if (! this.settings) (throw new Error ( "Paramètres n'est pas défini");)

Le membre paramètres de données doit exister parce qu'il contient des informations sur les méthodes à appeler lorsque la requête a abouti et qui en-têtes HTTP à ajouter à la demande. A ce stade, vous devriez remarquer que deux objets sont requis pour faire fonctionner le mode d'appel. Le premier objet est réglages, et le deuxième objet est le paramètre de demande. Comme un raccourci, un développeur peut combiner les deux objets en un seul, et, soit le remettre à l'appel de méthode ou de l'assigner au membre paramètres des données. Ce raccourci serait peu judicieux, parce que chaque objet a un but différent.

L'objet de requête est utilisée pour définir les paramètres de la requête d'URL spécifique en cours. Les paramètres de l'objet est utilisé pour définir les paramètres qui transcendent tous les appels et pourrait être une considéré comme un rappel mondial de l'instance d'objet asynchrone. L'idée est que vous allouez une instance de asynchrone, de définir comment il doit se comporter, et puis commencer à faire des requêtes avec la possibilité d'appeler les différentes URL. Puis l'étape suivante consiste à vérifier que l'instance en cours XMLHttpRequest n'est pas déjà occupé:

if (this.xmlhttp.readyState! = 4 & & this.xmlhttp.readyState! = 0) (throw new Error ( "demande Actuellement actif ne peut pas continuer");)
 

Lorsque vous utilisez XMLHttpRequest en mode asynchrone, il est possible de faire une nouvelle requête HTTP XMLHttpRequest sur une instance d'exécution. Le problème est que XMLHttpRequest ne peut pas servir deux demandes, et il cessera de la demande d'exécution déjà pour faire une nouvelle demande. La propriété readyState est utilisé pour indiquer l'état de l'objet XMLHttpRequest. Si readyState est 0, aucune demande n'a été faite et une requête HTTP peuvent être faites. Si readyState est 4, alors une requête a été déposée, la requête est terminée, et l'objet est prêt à faire une autre demande. Si readyState a une autre valeur, une demande qui est exécuté, et l'exécution ainsi une autre demande n'a pas de sens. Après l'initialisation et la vérification est terminée, il est possible de faire une requête: this.xmlhttp.open (request.action, demander . url, true, this.settings.username, this.settings.password); L'appel de la méthode ouverte, vous devez spécifier au verbe Un minimum HTTP (par exemple, GET, POST) par l'intermédiaire du membre de données request.action et l'URL via le membre de données request.url. Chaque fois que vous faites toute demande XMLHttpRequest, assurez-vous que la première action est la méthode Open. Si vous attribuez la fonction onreadystatechange avant d'appeler ouvert, votre demande ne pourra pas fonctionner correctement. Si vous essayez d'assigner têtes de la requête avant d'appeler ouvert, votre demande ne pourra pas fonctionner correctement. La méthode ouverte est utilisée pour initialiser et créer une nouvelle demande; cours ne seront pas appeler le serveur, comme c'est la responsabilité de l'envoyer.

Dans l'exemple de la méthode ouverte, un nom d'utilisateur et mot de passe (this.settings.username et this.settings.password, respectivement) sont toujours envoyées au serveur, même s'il n'ya pas de nom d'utilisateur et mot de passe. Il ne fait aucun mal à envoyer des valeurs NULL, et cela n'affectera pas le fonctionnement d'une requête HTTP. Le nom d'utilisateur et mot de passe sont utilisés uniquement lorsque le serveur HTTP effectue un défi et vous demande un nom d'utilisateur et mot de passe. Dans le contexte de l'objet XMLHttpRequest, le nom d'utilisateur et mot de passe sont utilisés uniquement si l'implémentation de XMLHttpRequest a besoin de l'information. Une fois que vous avez ouvert le demande, vous pouvez ajouter des en-têtes HTTP en utilisant la méthode setRequestHeaders:

if (Request.Headers) (for (defHeader dans Request.Headers) (this.xmlhttp.setRequestHeader (defHeader, Request.Headers [defHeader]);)) if (this.settings.headers) (for (defHeader dans this.settings . headers) (this.xmlhttp.setRequestHeader (defHeader, this.settings.headers [defHeader]);))

Les en-têtes sont affectés à deux reprises: une fois pour les paramètres associés à la demande (Request.Headers) et une fois pour les paramètres globaux (this.settings.headers). Les en-têtes que vous affectez-têtes peuvent être en-têtes HTTP standard ou personnalisé. Si vous prévoyez d'utiliser des en-têtes HTTP, il est toujours une bonne idée de leur préfixe avec X-. De cette façon, vos en-têtes ne seront pas confondus avec en-têtes HTTP standard. Une fois que vous avez assigné les en-têtes, la fonction de rappel onreadystatechange est assigné:

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

Dans l'implémentation asynchrone de onreadystatechange, une instruction switch exécute l'un des quatre états valides prêt. De la source, vous pouvez associer à chaque numéro avec un état spécifique. L'Etat prêt le plus important est de 4, indiquant que le contenu a été récupéré, chargé, et traitées. L'état 4 ready appelle la méthode définie par le client dans les paramètres de propriété. Notez que dans l'exécution de la fonction onreadystatechange attribué que la variable d'instance a remplacé la référence au présent.

La mise en œuvre de la fonction onreadystatechange est excessif, comme 98% du temps que vous utilisez Asynchronous vous ne se soucient de l'état Prêt de 4. Pour tous les autres États prêt, selon le navigateur, certaines fonctionnalités sont possibles. En raison de cette incohérence et le caractère incomplet de l'état de l'objet XMLHttpRequest, il n'y a pas de réel besoin de traiter les autres États de prêt. Le code restant appel de fonction consiste à envoyer la demande au serveur en utilisant la fonction d'envoi:

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

La fonction d'envoi est utilisé pour faire la demande physique pour le serveur. La fonction est également utilisée pour envoyer toutes les données associées à la demande. S'il n'y a pas de données, l'appel à envoyer avec la valeur NULL ne génère pas d'erreur. Lorsque la méthode Send a fait sa demande, elle retourne immédiatement, et la fonction JavaScript Asynchronous_call sera de retour de commande pour le navigateur. À ce moment, le client doit ajouter du code pour ne pas autoriser les appels multiples. Par exemple, si la demande a été activé en utilisant le bouton, puis jusqu'à la demande est de retour, le bouton peut être désactivé. Bien sûr, cela présente un problème potentiel si la demande ne revient jamais et que le bouton reste désactivé. Pour résoudre ce problème, vous pouvez introduire une minuterie qui donne à la demande d'un montant maximum de temps. Si, pendant ce temps, la demande n'a toujours pas retourné, la méthode XMLHttpRequest.abort est appelée et le bouton est activé à nouveau.

un article présenté par Sonja Lande


Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite.
Important: Cet article «Implémentation de la classe asynchrone en Ajax" a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.


Online: 387 users browsing the articles directory