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 :

ordre d'execution javascript


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2012
    Messages : 42
    Points : 32
    Points
    32
    Par défaut ordre d'execution javascript
    Bonjour,

    j'ai écrit un fonction en JS pour faire un insert en base puis rediriger l'internaute vers une autre fenetre. pour ça j'utilise un XMLHTTPRequest qui fonctionne très bien sans la redirection. en effet quand je mets en place les condition de redirection il fait la redirection avant de faire la requete.

    voici le code:
    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
    function insert(){
      var carte=getRadioVal('carte');
      var nom = document.getElementById('champsnom');
      var nom_value = nom.value;
      var prenom = document.getElementById('champsprenom');
      var prenom_value = prenom.value;
      var mail = document.getElementById('champsmail');
      var mail_value = mail.value;
      var type=getRadioVal('typo');
      if (type=='typpf'){
        var nommag=document.getElementById('searchp');    
      }
      if (type=='typst'){
        var nommag=document.getElementById('searchs');    
      }
      if (type=='typmg'){
        var nommag=document.getElementById('searchm');    
      }
      var mag_value=nommag.value; 
      db.transaction(
        function(t){
          t.executeSql("INSERT INTO gvappprod VALUES (?,?,?,?,?)", [nom_value,prenom_value,mail_value,mag_value,carte]);
              }
      );
      if (window.navigator.onLine){
      db.transaction(
        function(t){
          t.executeSql("SELECT nom AS nom, prenom AS prenom, mail AS mail, enseigne AS enseigne, choix AS choix FROM gvappprod",[],function(t,r){
            for (var i=0;i<r.rows.length;i++){
              nomloc=r.rows.item(i).nom;
              prenomloc=r.rows.item(i).prenom;
              mailloc=r.rows.item(i).mail;
              magloc=r.rows.item(i).enseigne;
              choixloc=r.rows.item(i).choix;
              //alert(mailloc);
              xhr = new XMLHttpRequest();
              xhr.open("GET", "insert.php?nom=" + nomloc + "&prenom=" + prenomloc + "&mail=" + mailloc + "&mag=" + magloc + "&choix=" + choixloc, true);
              alert ('on fait le send');
              xhr.send(null);
              }
            });
          }
      );
      vidange();
      }
      resetform();
      if (sessionStorage.getItem("page")=="1") {
        alert("onpart sur fin");
        //window.location.href='fin.html';
      } else {
        alert("onpart sur mobile");
        //window.location.href='trans.html';
      }
    };
    il fait "alert("onpart sur fin");" avant de faire "alert ('on fait le send');" du coup j'ai rien en base.

    je ne vois pas d'erreur pourtant. je pensait que JS s'exécutait de haut en bas. si c'est une erreur d'accolade ou de point virgule, je ne vois pas ou elle est.

    d'avance merci pour votre aide.

  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 : 54
    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
    je pensait que JS s'exécutait de haut en bas
    Sauf dans le cas de code asynchrone comme le sont souvent les requêtes AJAX.
    Voir : Un classique AJAX : utiliser les données au bon moment !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2012
    Messages : 42
    Points : 32
    Points
    32
    Par défaut
    ok, je comprend bien la nuance maintenant. c'est normal.
    c'est rassurant finalement.
    est ce que tu aurait le même exemple que pour ton post explicatif mais avec le callback qui fonctionne? je l'adapterai à ma sauce ensuite.
    Merci pour ton aide.

  4. #4
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Le callback qui fonctionne ?
    Dans l'exemple de Bovino, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    xhr.onreadystatechange = function(){ 
        if(xhr.readyState == 4 && xhr.status == 200){ 
            monResultat = xhr.responseText; 
            alert(monResultat); 
        } 
    };
    ... le "callback" est en rouge. Quand la requête côté serveur est terminée/les données reçues (xhr.readyState === 4) et la page dans un bon état (xhr.status === 200), tu peux faire ton traitement.
    soit tu mets le code "en vrac" comme ci-dessus. C'est alors plutôt un code de callback Soit tu définis une fonction et tu l'appelles à la place de ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     // Fonction callback
    function callback(monResultat) {
      // faire ce que tu veux avec monResultat
    }
     
    if(xhr.readyState == 4 && xhr.status == 200){ 
      callback(xhr.responseText);
    }

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2012
    Messages : 42
    Points : 32
    Points
    32
    Par défaut
    Je vois, mais mon problème ici n'est pas d'utiliser ce qui sort de mon xhr mais seulement de savoir quand il a fini... pour faire une redirection.

    Comment fait-on pour qu'AJAX finisse son boulot (quel feignasse!), soit synchrone et pas casse- couille?

  6. #6
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Le code que tu souhaites exécuter après que le xhr a fini son boulot doit être dans une fonction de callback, tu n'as pas le choix !

    Si j'ai bien compris, c'est ce code que tu souhaites faire à la fin de l'appel AJAX ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    resetform();
    if (sessionStorage.getItem("page")=="1") {
      alert("onpart sur fin");
      //window.location.href='fin.html';
    } else {
      alert("onpart sur mobile");
      //window.location.href='trans.html';
    }
    Et bien il faut le mettre dans le callback, c'est tout

    Pour reprendre l'analogie de Bovino, il faut attendre que ton pote revienne du poulailler pour faire l'omelette ! Sinon, sans les oeufs, comment veux-tu la faire ? On fait pas d'omelette sans casser les coui***, euh, les oeufs pardi

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2012
    Messages : 42
    Points : 32
    Points
    32
    Par défaut
    Avec toute ces infos, je m'en suis finalement sorti. J'ai fait ma requête dans la page de résultat, après la redirection.
    MErci pour votre aide!

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

Discussions similaires

  1. [javascript] ordre d'execution des functions ?
    Par gretch dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/08/2009, 15h51
  2. [AJAX] Executer Javascript chargé par Ajax
    Par Sylvain71 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 13/12/2007, 23h14
  3. comment forcer l'execution javascript
    Par jj del amorozo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 06/03/2006, 17h24
  4. Réponses: 5
    Dernier message: 29/12/2005, 13h47
  5. probleme ordre d'execution de ma page asp
    Par Shosho dans le forum ASP
    Réponses: 5
    Dernier message: 10/05/2005, 14h51

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