Partage
  • Partager sur Facebook
  • Partager sur Twitter

[AJAX] Une seule requête à la fois !

Sujet résolu
    24 août 2011 à 0:32:02

    Bonjour,

    Je suis en train de lire le tuto sur l'AJAX: http://www.siteduzero.com/tutoriel-3-1 [...] prequest.html

    J'ai du mal à comprendre une partie de ce code:

    var xhr = null;
    
    function request(callback) {
    	if (xhr && xhr.readyState != 0) {
    		xhr.abort(); // On annule la requête en cours !
    	}
    
    	xhr = getXMLHttpRequest(); // plus de mot clé 'var'
    	
    	xhr.onreadystatechange = function() {
    		/* ... */
    	};
    	
    	xhr.open("GET", "XMLHttpRequest_getSleep.php?Sleep=" + sleep, true);
    	xhr.send(null);
    }
    


    En fait à la première condition je ne comprend pas: if (xhr && xhr.readyState != 0), pourquoi il y le xhr?

    en espérant que vous puissiez m'aider,

    Cordialement,

    sushis
    • Partager sur Facebook
    • Partager sur Twitter
      24 août 2011 à 10:26:53

      sushis > la variable xhr est globale parce qu'elle est définit en dehors des fonctions (elle est donc accessible dans toutes les fonctions). C'est comme ça en JavaScript.

      Si tu veux avoir plusieurs objets xhr indépendant, il faut les passer à chaque fois en paramètre.
      • Partager sur Facebook
      • Partager sur Twitter
        24 août 2011 à 10:58:36

        C'est bizarre mais ton titre ne semble pas correspondre à ce que tu dis ensuite dans ton message.
        Comme Kyle Katarn semble avoir répondu à ton titre, je vais répondre à

        Citation : sushis

        je ne comprend pas: if (xhr && xhr.readyState != 0), pourquoi il y le xhr?


        Le problème est que, parfois (comme lors de la première exécution), xhr vaut null. Donc si tu fais (null).readyState javascript va rencontrer une erreur (car il est impossible de lire le contenu d'un objet qui n'existe pas).

        Attention, dans ce cas il y a une erreur (et donc le script s'arrête), il ne faut pas confondre avec le cas où la variable pourrait être lues mais n'existe pas (à ce moment cela retourne undefined).
        ({}).readyState va retourner undefined car readyState n'existe pas dans l'objet vide {}
        ({}).readyState.toto va retourner une erreur car toto ne peux pas exister dans un objet indéfini

        Du coup pour éviter ce problème, on vérifie que xhr n'est pas équivalent à null avant de vérifier la valeur de readyState
        ce qui donne xhr && xhr.readyState != 0 (si xhr vaut null ou undefined alors la première partie de la condition est fausse et le script ne regarde pas la 2e partie de la condition)
        • Partager sur Facebook
        • Partager sur Twitter
          24 août 2011 à 14:04:36

          On vérifie que xhr existe bien (n'est pas égal à null ou a undefined).

          Merci pour vos réponses!
          • Partager sur Facebook
          • Partager sur Twitter

          [AJAX] Une seule requête à la fois !

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown