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 :

[AJAX] AJAX Asynchrone ne fonctionne pas


Sujet :

JavaScript

  1. #1
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut [AJAX] AJAX Asynchrone ne fonctionne pas
    Bonjour,

    J'ai un petit souci avec AJAX :
    Lorsque j'envoie ma requête HTTP en mode synchrone, il n'y a aucun problème. Par contre, lorsque je souhaite envoyer en mode asynchrone, le navigateur me dit :
    Les données nécessaires pour terminer l'opération ne sont pas encore disponibles

    Vu que la requête SQL que j'ai à faire est assez longue, ça nuit beaucoup à la fluidité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var xhr=getXhr();
            xhr.open("GET","../../includes/bd_action.php?act=delPlanif&addsupIdOrg=" + id_org + "&addsupPlanSeq=" + plan_seq + "&addsupDate=" + pd, false);
    		xhr.send(null);
    ==> Ca marche !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var xhr=getXhr();
            xhr.open("GET","../../includes/bd_action.php?act=delPlanif&addsupIdOrg=" + id_org + "&addsupPlanSeq=" + plan_seq + "&addsupDate=" + pd, true);
    		xhr.send(null);
    ==> Les données nécessaires pour terminer l'opération ne sont pas encore disponibles

    Merci

  2. #2
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 131
    Points : 95
    Points
    95
    Par défaut
    tu peut nous montrer le code qui recupere les donnees ...
    merci

  3. #3
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut
    Je pense que tu parles du code PHP côté serveur :

    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
    if ($_GET["act"]='delPlanif') {
     
    $planDate = substr($_GET["addsupDate"],0,4) . "-" . substr($_GET["addsupDate"],4,2) . "-" . substr($_GET["addsupDate"],6,2);
    $link = pg_connect($conn_string) 
    	or die("Connexion Impossible! ");
     
    	$req = "SELECT id FROM T_p ";
    	$req .= "WHERE plan_seq =" . $_GET["addsupPlanSeq"] . " AND id_org = '" . $_GET["addsupIdOrg"] . "' ";
    	$result = pg_query($link,$req);
    	$line = pg_fetch_array($result);
    	$id_trait_org = $line[0];
     
       $sql  = "UPDATE T_p ";
       $sql .= "SET plan_status = 5, plan_histo = '' ";
       $sql .= "WHERE id_trait_org=" . $id_trait_org .";";
       $res = pg_query($link,$sql);
     
       $sql2  = "SELECT trait_nom, plan_ord_day, trait_lib, freq_type ";
       $sql2 .= "FROM T_traitements, T_trait_org, T_planif ";
       $sql2 .= "WHERE T_traitements.id_trait = T_trait_org.id_trait ";
       $sql2 .= "AND T_planif.id_trait_org = T_trait_org.id_trait_org ";
       $sql2 .= "AND T_planif.plan_seq = " . $_GET["addsupPlanSeq"] . "; ";   
       $nomPos = pg_fetch_array(pg_query($link,$sql2));
     
       $sql3  = "UPDATE T_planif ";
       $sql3 .= "SET plan_ord_day = plan_ord_day - 1 ";
       $sql3 .= "WHERE id_trait_org=" . $id_trait_org . " ";
       $sql3 .= "AND plan_ord_day > '" . $nomPos['plan_ord_day'] . "'; ";
       $res3 = pg_query($link,$sql3);
     
       echo $nomPos["trait_nom"] . "|" . $nomPos["trait_lib"] . "|" . $nomPos["freq_type"];
     
       pg_close();
    }

  4. #4
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut
    Sinon si ca vous interesse, le script 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
    function f(id_org,plan_seq,plan_date,ligne) {
    if (confirm('Etes-vous sur?'))
       {   
        var mytool_array=plan_date.split("-");
    	var pd = mytool_array[0] + mytool_array[1] + mytool_array[2];		
       try {
            var xhr=getXhr();
            xhr.open("GET","../../includes/bd_action.php?act=delPlanif&addsupIdOrg=" + id_org + "&addsupPlanSeq=" + plan_seq + "&addsupDate=" + pd, true);
    		xhr.send(null);        
            if(xhr.readyState == 4 && xhr.status == 200){            
    			for (i=1;i<100;i++) {
    				param = "b" + ligne.id + "00" + i;
    				try {
    					ligneParam = document.getElementById(param);
    					document.getElementById('tableauPlanif').deleteRow(ligneParam.rowIndex);	
    				} catch (ex) {
    					break;
    				}
    			}		
    			document.getElementById('tableauPlanif').deleteRow(ligne.rowIndex);	
    			fctRefuse(xhr.responseText,plan_date,id_org,plan_seq);
    			document.getElementById('nbTraitPlanif').innerHTML = "resultat : " 
    + (document.getElementById('tableauPlanif').tBodies[1].rows.length);		
            } else {
                alert("le serveur renvoie une erreur:" + xhr.responseText);
            }
        } catch (ex) {
            alert("Action impossible: " + ex.message);
        }
       }
    }

    Merci d'avance pour votre aide

  5. #5
    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
    cf : http://siddh.developpez.com/articles/ajax/#LIII

    Utilise l'évenement onreadystatechange de ton objet Ajax, c'est la seule façon de faire avec l'asynchrone.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 239
    Points
    3 239
    Par défaut
    Citation Envoyé par denisC
    cf : http://siddh.developpez.com/articles/ajax/#LIII

    Utilise l'évenement onreadystatechange de ton objet Ajax, c'est la seule façon de faire avec l'asynchrone.
    +1

    Par contre, tant qu'il y aura une faute dans le tutoriel, je préfère qu'on ne le référence pas comme solution
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  7. #7
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 131
    Points : 95
    Points
    95
    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
    xhr.onreadystatechange  = function() {
     if(xhr.readyState == 4 && xhr.status == 200){            
    			for (i=1;i<100;i++) {
    				param = "b" + ligne.id + "00" + i;
    				try {
    					ligneParam = document.getElementById(param);
    					document.getElementById('tableauPlanif').deleteRow(ligneParam.rowIndex);	
    				} catch (ex) {
    					break;
    				}
    			}	
     
    }
    Sa doit etre un truc dans le genre ...

  8. #8
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut
    C'est bien sympa le onreadystatechange, mais ça ne change pas grand chose finalement...
    La différence c'est que le try catch ne renvoie pas d'exception (donc pas d'alert) mais dans la console javascript, ça y va méchamment...
    De plus, le temps d'attente est identique.
    Etes-vous sûr qu'il s'agisse de la solution au problème ?

  9. #9
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 131
    Points : 95
    Points
    95
    Par défaut
    Y a quoi comme erreur dans ta console java script

  10. #10
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut
    Citation Envoyé par ldcarpathes
    Y a quoi comme erreur dans ta console java script
    Les données nécessaires pour terminer l'opération ne sont pas encore disponibles

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 239
    Points
    3 239
    Par défaut
    Il ne doit subsister que le onreaystatechange
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  12. #12
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut
    Citation Envoyé par FremyCompany
    Il ne doit subsister que le onreaystatechange
    c'est-à-dire ?

    voilà ce que j'ai pour le moment :

    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
    function f(id_org,plan_seq,plan_date,ligne) {
    if (confirm('Etes-vous sur ?'))
       {   
        var mytool_array=plan_date.split("-");
    	var pd = mytool_array[0] + mytool_array[1] + mytool_array[2];		
       try {
            var xhr=getXhr();				xhr.onreadystatechange = function(){
    		if(xhr.readyState == 4 && xhr.status == 200){					for (i=1;i<100;i++) {
    				param = "b" + ligne.id + "00" + i;
    				try {
    					ligneParam = document.getElementById(param);
    						document.getElementById('tableauPlanif').deleteRow(ligneParam.rowIndex);	
    					} catch (ex) {
    						break;
    					}
    				}		
     
    					document.getElementById('tableauPlanif').deleteRow(ligne.rowIndex);	
    					try {
    						fctA(responseText,plan_date,id_org,plan_seq);
    					} catch (ex) {}
    					document.getElementById('nbTraitPlanif').innerHTML = "s : " + (document.getElementById('tableauPlanif').tBodies[1].rows.length);		
    			} else {
    				alert("le serveur renvoie une erreur:" + xhr.responseText);
    			}
    		}
            xhr.open("GET","../../includes/bd_action.php?act=delPlanif&addsupIdOrg=" + id_org + "&addsupPlanSeq=" + plan_seq + "&addsupDate=" + pd, true);
    		xhr.send(null);                
        } catch (ex) {
            alert("impossible: " + ex.message);
        }
       }
    }

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 239
    Points
    3 239
    Par défaut
    Quelle est la ligne de l'erreur ?

    Sinon, je mettrais l'instanciation de onreadystatechange après open mais avant send
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  14. #14
    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 FremyCompany
    Par contre, tant qu'il y aura une faute dans le tutoriel, je préfère qu'on ne le référence pas comme solution
    Il n'y aucune faute dans ce tutoriel.

    La faute vient des gens qui pensent qu'on peut copier/coller le code qui fait quelque chose quelque part vers n'importe ou pour faire autre chose.
    La concurrence n'est pas gérée sur l'objet XHR dans ce script, et ça serait bien de le préciser, mais ce n'est en aucun cas une erreur.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 239
    Points
    3 239
    Par défaut
    Citation Envoyé par denisC
    Il n'y aucune faute dans ce tutoriel.

    La faute vient des gens qui pensent qu'on peut copier/coller le code qui fait quelque chose quelque part vers n'importe ou pour faire autre chose.
    La concurrence n'est pas gérée sur l'objet XHR dans ce script, et ça serait bien de le préciser, mais ce n'est en aucun cas une erreur.
    Euh, ca dépend comment tu considère une erreur....

    Pour moi un déni de service est une erreur (et ici, il s'agit bien d'un déni de service, vu qu'on ne peut pas lancer plusieurs reqêtes et que ce n'est précisé nulle part)

    D'ailleurs, je dois te dire qu'au moins une fois par semaine je dois corriger la faute dans le script ajax de qqun sur le forum...

    Je trouve ca lourd à la fin... surtout que ca demanderait à Siddh 1 minutes tout au plus pour corriger son tuto... ou au moins prévenir que si on veut plusieurs requete, la méthode ne convient pas...
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  16. #16
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut
    Citation Envoyé par FremyCompany
    Quelle est la ligne de l'erreur ?
    Voici la ligne de l'erreur :

    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
    function f(id_org,plan_seq,plan_date,ligne) {
    if (confirm('Etes-vous sur ?'))
       {   
        var mytool_array=plan_date.split("-");
    	var pd = mytool_array[0] + mytool_array[1] + mytool_array[2];		
       try {
            var xhr=getXhr();	
    xhr.open("GET","../../includes/bd_action.php?act=delPlanif&addsupIdOrg=" + id_org + "&addsupPlanSeq=" + plan_seq + "&addsupDate=" + pd, true);			xhr.onreadystatechange = function(){
    		if(xhr.readyState == 4 && xhr.status == 200){					for (i=1;i<100;i++) {
    				param = "b" + ligne.id + "00" + i;
    				try {
    					ligneParam = document.getElementById(param);
    						document.getElementById('tableauPlanif').deleteRow(ligneParam.rowIndex);	
    					} catch (ex) {
    						break;
    					}
    				}		
    				
    					document.getElementById('tableauPlanif').deleteRow(ligne.rowIndex);	
    					try {
    						fctA(responseText,plan_date,id_org,plan_seq);
    					} catch (ex) {}
    					document.getElementById('nbTraitPlanif').innerHTML = "s : " + (document.getElementById('tableauPlanif').tBodies[1].rows.length);		
    			} else {
    				alert("le serveur renvoie une erreur:" + xhr.responseText);
    			}
    		}
            
    		xhr.send(null);                
        } catch (ex) {
            alert("impossible: " + ex.message);
        }
       }
    }
    Citation Envoyé par FremyCompany
    Sinon, je mettrais l'instanciation de onreadystatechange après open mais avant send
    J'ai essayé et rien n'y change...

  17. #17
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut
    A mon avis c'est le xhr.reponseText qui pose probleme.
    Mais je me dois de récupérer des données du serveur ...

  18. #18
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 32
    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 suis idiot
    Désolé de ne pas avoir vu ca plutot mais en fait, en mode asynchrone, la méthode onreadystatechange est exécutée 4 fois :
    readyState=1 'Ouvert
    readyState=2 'En cours
    readyState=3 'En récéption
    readyState=4 'Terminé

    Lorsque readyState est à 4, responseText, responseXML, status et statusText sont valides sous FF (avant pas)

    donc, tu dois changer ta validation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (xhr.readyState==4) {
       if (xhr.status==200) {
         //...
       } else {
         alert("Le serveur renvoie une erreur :" xhr.statusText)
       }
    }
    Deplus si status n'est pas égal à 200, cela veut dire qu'il n'y a pas de xhr.responseText valide (404: fichier non trouvé, 500: erreur coté serveur, ...)
    Fremy
    Pour vos développements Web et une navigation agréable, le tout gratuit :
    1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
    2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey

  19. #19
    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 FremyCompany
    Euh, ca dépend comment tu considère une erreur....

    Pour moi un déni de service est une erreur (et ici, il s'agit bien d'un déni de service, vu qu'on ne peut pas lancer plusieurs reqêtes et que ce n'est précisé nulle part)
    Il n'est précisé nulle part non plus qu'on ne peut pas sécher un chat avec Ajax, ou bien cuire des merguez. Sérieusement, ce tutoriel fonctionne parfaitement sur le domaine qu'il s'est donné.

    Si tu as envie de contribuer sous la forme d'un tutoriel tu es le bienvenu

  20. #20
    Membre averti Avatar de linar009
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    497
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 497
    Points : 323
    Points
    323
    Par défaut
    Merci Fremy! Ca marche impeccable maintenant : plus d'erreurs dans la console.

    Un grand merci.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/03/2017, 18h47
  2. [AJAX] Tutoriel ajax du site ne fonctionne pas sous IE 9
    Par Super_carotte dans le forum AJAX
    Réponses: 2
    Dernier message: 20/01/2015, 10h34
  3. [AJAX] ajax et xml ne fonctionnant pas sous Firefox
    Par Phpdebut dans le forum AJAX
    Réponses: 7
    Dernier message: 03/02/2010, 12h15
  4. Réponses: 2
    Dernier message: 20/08/2008, 23h09
  5. [AJAX] AJAX+Firefox : readyState ne dépasse pas le 1
    Par TheRedLed dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/04/2007, 13h42

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