IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] xmlhttp.readyState affiche la valeur 1 puis se plante


Sujet :

AJAX

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Points : 47
    Points
    47
    Par défaut [AJAX] xmlhttp.readyState affiche la valeur 1 puis se plante
    Bonjour,

    Je vous fait part de mon anomalie dans la page JSP.. En fait, je manipule l'objet xmlhttpRequest pour insérer des données dans une BD d'un serveur distant..

    Je remarque lors de certains traitements (après avoir cliqué sur le bouton submit) que mon "xmlhttp.readyState" n'atteigne pas la valeur 4 (suite verification grâce à un alert() )... Il affiche juste la valeur 1 puis plus rien.

    Je n'arrive pas à reconnaitre la cause puisque celà n'arrive pas à tous les coups, au contraire, le process se déroule normalement la plupart du temps, ce qui me rend dans l'incapacité de créer un scénario ou sa plante..
    Mais je sais que le problème existe (il est aussi bloquant car il fait croire à une insertion dans la BD alors que ce n'est pas le cas)

    Je vous poste une extrait de mon code javascript

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    function handleServerResponseInsertion() {
     
    		try{
    		   if (xmlhttp.readyState == 4) {	
     
    		     if(xmlhttp.status == 200) {
     
    		    	alert("insertion congé réussie");		
    		     }
    		     else {
    		        alert("Error during AJAX call. Please try again");
    		     }
    		   }
    		else {
        		// IF CONNECTION IS BUSY, WAIT AND RETRY
        		setTimeout("handleServerResponseInsertion()", 1000);
    		}
    		}
    		 catch(e) {
      		alert('ERROR: ' + e);
      	}
    	}
    PS : en cas de crash, meme le "alert('ERROR: ' + e);" ne s'affiche pas

    Merci pour vos réponses

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    après avoir cliqué sur le bouton submit
    Est-ce que tu annules l'action par défaut du submit ?
    Parce que sinon, la raison est simple : au clic, tu envoies la requête et avant qu'elle ne revienne (voire avant qu'elle ai réellement eu le temps de partir), tu soumets le formulaire, du coup, tu ne peux pas recevoir de réponse.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Points : 47
    Points
    47
    Par défaut
    Je vous remercie pour votre réponse,

    En fait, je n'annule aucune action, voici le code de mon bouton "submit" qui n'est pas un bouton submit en réalité mais qui joue le même rôle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href="javascript:endTask();"><%=appDico.getKeyValue("button.endTask")%></a>
    Et voici la fonction javascript endTask() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function endTask()
        {
     
    	if (!w4JsCheckMandatoryFields()) return void(false);
          document.forms[0].template.value="Templates/workItems.jsp";
          document.forms[0].inv1.value="fullTaskRef.endTask";
          document.forms[0].requestBegin.value = (new Date()).getTime();
          insertConge();
          document.forms[0].submit();
          return true;
        }
    La fonction qui se charge de l'insertion et qui utilise xmlHttpRequest est insertConge() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function insertConge()
        {
    //initialisation des variables mises en jeu matDemandeur, dateDebut...
     
    var param = "?param="+matDemandeur+"/"+dateDeb+"/"+dateFin+"/"+codeTypeConge+"/"+duree+"/"+unite+"/"+typeAbsence+"/"+moisCompta+"/"+anneeCompta+"/"+sdateCreation+"/"+loginDemandeur+"/"+groupeComptaEmploye;
     
    	alert(param);	
    		if(xmlhttp) { 
    		    xmlhttp.open("GET","http://"+serverAdress+"/Conge/InsertionCongeServlet"+param,true);//Appel de la servlet avec des parametres
    		    xmlhttp.onreadystatechange  = handleServerResponseInsertion;
    		    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    		    xmlhttp.send(null);
    		  }
    	}
    Je pense que mes appels sont corrects ?

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Le principe est le même, l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.forms[0].submit();
    est exécutée avant l'exécution complète de la requête, puisque celle-ci est asynchrone
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Points : 47
    Points
    47
    Par défaut
    Ah d'accord, J'ai compris le principe..
    Comment pourrais-je y remédier alors pour s'assurer que ma Requête xmlHttpRequest est entièrement exécutée à tous les coups avant le submit ?

    Merci

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Salut,
    je laisse à Bovino le soin de répondre à cette dernière question.
    Moi j’ai vu un timeout dans le corps de ta fonction, et ça me dérange : il fait concurrence avec le onreadystatechange, et je le trouve pas utile.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    PS : en cas de crash, meme le "alert('ERROR: ' + e);" ne s'affiche pas
    Tiens, j'avais pas vu ça non plus...
    Ton try catch ne sert absolument à rien puisque le try ne peut pas soulever d'exception (ne pas remplir une condition if ne génère pas d'erreur), tu ne passeras jamais dans le catch

    Comment pourrais-je y remédier alors pour s'assurer que ma Requête xmlHttpRequest est entièrement exécutée à tous les coups avant le submit ?
    Ben en mettant le submit() dans le callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(xmlhttp.status == 200) {
        alert("insertion congé réussie");
        document.forms[0].submit();
    }
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  8. #8
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Points : 47
    Points
    47
    Par défaut
    Merci Watilin pour ta réponse.

    Bovino, Je te tire mon chapeau , non seulement j'ai résolu mon problème, mais j'ai aussi compris le principe de ce qui Asynchrone dans mon cas..

    Effectivement, il fallait placer le submit() juste après s'être assuré que mon xmlHttpRequest ait terminé son travail du début jusqu'à la fin (xmlhttp.status = "Server OK" )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/03/2011, 11h17
  2. [AJAX] Afficher la valeur d'une liste dans une zone de texte
    Par debutantasp dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/11/2007, 17h12
  3. [AJAX] Afficher deux valeurs
    Par Arfigado dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/09/2006, 15h38
  4. Réponses: 3
    Dernier message: 28/01/2004, 14h55
  5. Afficher une valeur du context
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 13
    Dernier message: 28/04/2003, 13h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo