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

JavaScript Discussion :

[XmlHttpRequest] - Asynchrone ne renvoie plus rien ??


Sujet :

JavaScript

  1. #1
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut [XmlHttpRequest] - Asynchrone ne renvoie plus rien ??
    bonsoir,

    après avoir lu pas mal de tuto dont celui de developpez.com, il y a un phenomène que je n'explique pas.

    Que peut il y avoir pour qu'un objet xmlhttprequest fonctionne correctement en mode synchrone (Testé avec ReponseText & ReponseXML) & ne renvoie plus rien en asynchrone (par contre objxmlhttprequest.readyState par par tous les etats jusqu'a 4) ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      Les code possibles pour le statut de l'objet sont :
        * 0 = non initialisé ;
        * 1 = ouverture. La méthode open() a été appelée avec succès ;
        * 2 = envoyé. La méthode send() a été appelée avec succès ;
        * 3 = en train de recevoir. Des données sont en train d'être transférées, mais le transfert n'est pas terminé ;
        * 4 = terminé. Les données sont chargées. ;
    merci pour votre aide !!

    :[/code]

  2. #2
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut Re: [XmlHttpRequest] - Asynchrone ne renvoie plus rien ??
    Citation Envoyé par jacquesh
    bonsoir,

    après avoir lu pas mal de tuto dont celui de developpez.com, il y a un phenomène que je n'explique pas.

    Que peut il y avoir pour qu'un objet xmlhttprequest fonctionne correctement en mode synchrone (Testé avec ReponseText & ReponseXML) & ne renvoie plus rien en asynchrone (par contre objxmlhttprequest.readyState par par tous les etats jusqu'a 4) ???
    Comment est-ce que tu l'utilises?

  3. #3
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    voila mon code JS :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    function getHTTPObject() {
    	var xmlhttp;
    	/*@cc_on
    	@if (@_jscript_version >= 5)
    		try {
    			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    			} catch (e) {
    			try {
    				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    				} catch (E) {
    				xmlhttp = false;
    				}
    			}
    	@else
    	xmlhttp = false;
    	@end @*/
    	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    		try {
    			xmlhttp = new XMLHttpRequest();
    			} catch (e) {
    			xmlhttp = false;
    			}
    		}
    	return xmlhttp;
    }
     
    // Creation de l'obj http
    var http = getHTTPObject() ;
     
    function handleHttpResponse(){
    	switch (http.readyState){
    		case 4:
    			logger("Status : OK.") ;
    		break ;
    		case 3:
    			logger("Status : Transfert de donnees en cours...") ;
    		break ;
    		case 2:
    			logger("Status : Attente de la reponse...") ;
    		break ;
    		case 1:
    			logger("Status : Connexion au serveur...") ;
    		break ;
    		case 0:
    			logger("Status : Connexion non initialise !! ") ;
    		break ;
    	}
    }
     
    // Chargement des données via XMLHTTPREQUEST
     
    function loadData(method,url,dest,sync){
     
    	// HTTP
    	http.open(method,url,sync) ;
    	http.onreadystatechange = handleHttpResponse ;
    	http.send(null) ;
     
    	var doc = document.getElementById(dest) ;
    	doc.innerHTML = http.responseText ;	
    }
     
    // ne renvoie rien
    loadData('GET','loaddata.php?dest=sbase','sbase',true);
     
    // ok
    loadData('GET','loaddata.php?dest=sbase','sbase',false);

  4. #4
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par jacquesh
    function loadData(method,url,dest,sync){

    // HTTP
    http.open(method,url,sync) ;
    http.onreadystatechange = handleHttpResponse ;
    http.send(null) ;

    var doc = document.getElementById(dest) ;
    doc.innerHTML = http.responseText ;
    }
    C'est complétement synchrone, ton code là. C'est normal que si tu envoies ta requete en asynchrone, tu n'aies rien du tout!!!!!!!!

  5. #5
    Membre averti Avatar de NeHuS
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 343
    Points : 316
    Points
    316
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     function loadData(method,url,dest,sync)
    { 
    xmlhttp.open(method , url , sync);
    // dans ton cas xmlhttp.open('Get','loaddata.php?dest=sbase',true);
     
    ....
    // mettre a la fin 
     
    xmlhttp.send(doc);
    }

  6. #6
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function loadData(method,url,dest,sync){
     
    	// HTTP
    	http.open(method,url,sync) ;
    	http.onreadystatechange = handleHttpResponse ;
     
     
    	var doc = document.getElementById(dest) ;
    	doc.innerHTML = http.responseText ;	
     
    	http.send(doc) ;
    }
    ne renvoi rien non plus

  7. #7
    Membre averti Avatar de NeHuS
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 343
    Points : 316
    Points
    316
    Par défaut
    tu peux nous montrer le tag de cette variable stp ?

    var doc = document.getElementById(dest) ;

    dest c'est quoi ? un select , un input ?

    même si ton request fonctionne en synchrone ça m'interesserait de savoir a quel tag correpond l'id dest

  8. #8
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    le tag correspond à un div.

    loaddata.php parse un fichier XML & envoi une requete oracle et je fait un 'echo' de tout ca.

    quand j'appelle mon fichier http://mon-url.com/loaddata.php?prop=value j'ai une reponse correcte.

    :

  9. #9
    Membre averti Avatar de NeHuS
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 343
    Points : 316
    Points
    316
    Par défaut
    ce qui veut dire que c'est l'envoi qui pose probleme et non la page qui receptionne l'info et je vois pourquoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    http.open(method,url,sync) ;
       http.onreadystatechange = handleHttpResponse ;
    mais ta fonction handleHttpResponse ( d'ailleurs c'est une bonne idée d efaire comme ça ) ne fait strictement rien a part afficher un etat ...

    c'est pourtant dans celle ci que tu doi faire ça :
    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
    24
    25
    26
    27
     
    function handleHttpResponse()
    {
       switch (http.readyState){
          case 4:
             logger("Status : OK.") ;
     
     var doc = document.getElementById(dest) ;
       doc.innerHTML = http.responseText ;    
     
          break ; 
     
     
    ...
    }
     
    function loadData(method,url,dest,sync){
     
       // HTTP
     
     
       http.open(method,url,sync) ;
       http.onreadystatechange = handleHttpResponse ;
       http.send(null) ;
     
     
    }

  10. #10
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par jacquesh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function loadData(method,url,dest,sync){
     
    	// HTTP
    	http.open(method,url,sync) ;
    	http.onreadystatechange = handleHttpResponse ;
     
     
    	var doc = document.getElementById(dest) ;
    	doc.innerHTML = http.responseText ;	
     
    	http.send(doc) ;
    }
    ne renvoi rien non plus
    Tant que tu utiliseras le résultas de ton objet XHR en dehors de handleHttpResponse, tu n'auras jamais de la vie un code asynchrone!

    J'explique:
    open prépare une requete HTTP. send l'envoie et si tu l'envoies en asynchrone, repasse la main au script tout de suite, sans attendre la réponse (normal c'est asynchrone). Le code continue son execution (et là tu lui parles de http.responseText qui est la réponse qu'il n'a pas, et donc il te donne un null). Après un certain temps (200ms, 2jours, 5ans), ta requete HTTP revient et à ce moment là, javascript execute la fonction que tu as liée au onreadystatechange. Donc c'est dans cette fonction et uniquement dans celle-ci que peut avoir lieu une interaction avec la réponse de la requete.....

  11. #11
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    ok

    mais alors pourquoi ce script s'arrete à l'état 1 :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    // Creation de l'obj http
    var http = getHTTPObject() ;
     
    function handleHttpResponse(dest){
    	var doc = document.getElementById(dest) ;
    	switch (http.readyState){
    		case 4:
    			logger("Status : OK.") ;
    			doc.innerHTML = http.responseText ;
    		break ;
    		case 3:
    			logger("Status : Transfert de donnees en cours...") ;
    		break ;
    		case 2:
    			logger("Status : Attente de la reponse...") ;
    		break ;
    		case 1:
    			logger("Status : Connexion au serveur...") ;
    		break ;
    		case 0:
    			logger("Status : Connexion non initialise !! ") ;
    		break ;
    	}
    }
     
    // Chargement des données via XMLHTTPREQUEST
     
    function loadData(method,url,dest,sync){
    	// HTTP
    	http.open(method,url,sync) ;
    	http.onreadystatechange = handleHttpResponse(dest) ;
    	http.send(null) ;
    }
    ... et j'ai jamais la réponse..... ya pas moyen d'envoyer un argument à handleHttpResponse

  12. #12
    Membre averti Avatar de NeHuS
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 343
    Points : 316
    Points
    316
    Par défaut
    essayes en dur comme ça pour voir :

    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
     
    var url = "loaddata.php?dest=sbase";
    function loadData
    {
     
     http.open("GET", url , true);
     
      http.onreadystatechange = handleHttpResponse;
     
      http.send(null);
    }
     
    function handleHttpResponse() 
    {
     
        if (http.readyState == 4) {
           results = http.responseText;
        document.getElementById('l'id en dur').innerHTML = results ;
       }
    }
    Si cela fonctionne ce sont tes variables qu posent probleme...

  13. #13
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    en dur ca fonctionne... mais on est quand même pas obligé de creer une fonction a chaque fois : ya pas moyen de lui passer un paramètre : :

  14. #14
    Membre averti Avatar de NeHuS
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 343
    Points : 316
    Points
    316
    Par défaut
    bien entendu qu'on peut la rendre plus generique , mais je voulais souligner le fait que ce sont tes parametres qui posent probleme .

    Maintenant essaye un par un tes arguements
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    var http = getHTTPObject() ;
     
    function loadData(method,url,sync,dest){
       // HTTP
       http.open(method,url,sync) ;
     //Edit
       http.onreadystatechange = function() {handleHttpResponse(dest)}; 
       http.send(null) ;
    } 
     
    function handleHttpResponse(dest){
     
       switch (http.readyState){
          case 4:
     
             document.getElementById(dest).innerHTML  =  http.responseText ;
              logger("Status : OK.") ;
     
     
          break ;
          case 3:
             logger("Status : Transfert de donnees en cours...") ;
          break ;
          case 2:
             logger("Status : Attente de la reponse...") ;
          break ;
          case 1:
             logger("Status : Connexion au serveur...") ;
          break ;
          case 0:
             logger("Status : Connexion non initialise !! ") ;
          break ;
       }
    }

  15. #15
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par jacquesh
    http.onreadystatechange = handleHttpResponse(dest) ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    http.onreadystatechange = function() {handleHttpResponse(dest)};
    Mais si il faut créer la fonction à chaque fois, mais c'est pas si dur que ça

  16. #16
    Membre averti Avatar de NeHuS
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 343
    Points : 316
    Points
    316
    Par défaut
    ah oui j'avais oublié le function ()

  17. #17
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 239
    Points
    3 239
    Par défaut Je ne suis juste débutant mais je me pose une bête question:
    Dans ton cas, tu utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http.open("GET", url + "?" + args, bool)
    Alors pourquoi trouver
    et pas ?

    Fremy

  18. #18
    Membre régulier Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Points : 119
    Points
    119
    Par défaut
    nikel !!

    merci pour toutes vos infos

    j'y avais pas penser à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function() {handleHttpResponse(dest)};
    sinon je ne pouvais pas me permettre de creeer plusieurs fonctions dans le sens ou les div où le resultat doit être ecrit sont dynamiquement créée

    merci encore et un résolu de plus pour les stats

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/01/2009, 15h17
  2. Je n'y comprend plus rien
    Par Pingouinvert dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 11/09/2005, 10h57
  3. [BDE] Plus rien dans Configuration/Drivers/Native
    Par Harry dans le forum Bases de données
    Réponses: 5
    Dernier message: 11/02/2005, 16h15
  4. Root qui ne peux plus rien faire :'(
    Par Smortex dans le forum Administration
    Réponses: 2
    Dernier message: 27/09/2004, 20h13
  5. [Kylix] Je n'y comprends plus rien
    Par fafamonteko dans le forum EDI
    Réponses: 5
    Dernier message: 02/03/2004, 16h48

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