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 :

Contrôler l'exécution des instructions


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Points : 15
    Points
    15
    Par défaut Contrôler l'exécution des instructions
    Bonjour !

    Voilà mon souci est que, dans une fonction, j'ai entre autre 3 instructions qui devraient s'exécuter l'une après l'autre (en tout cas c'est ce que j'attendais d'un langage procédural comme JavaScript, ou alors j'ai rien compris...)

    Sauf que, la fonction XAJAX en seconde position, n'a pas l'air d'attendre la récupération des valeurs en première position, valeurs que je passe en paramètre dans l'appel de cette fonction XAJAX.

    De même pour l'instruction JavaScript, qui n'a pas l'air d'attendre la fin de l'exécution de la fonction XAJAX pour s'exécuter.

    Or j'ai impérativement besoin que chaque instructions soit bloquantes pour la suite... J'ai donc rusé en définissant un timer de quelques centaines de millisecondes, mais c'est du "bob le bricoleur style" et en général çà donne lieu à d'horribles bugs suivants les navigateurs, les postes, les couleurs...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function remplir() {
    	var pid = (document.getElementById("acSelect_table").value).split(";")[1];
    	var eid = (document.getElementById("acSelect_table").value).split(";")[2];
    	setTimeout('xajax_remplir_table('+pid+', '+eid+')',100);
    	setTimeout('document.getElementById("selection_'+eid+'").checked	=	"true"',300);
    }
    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonsoir,

    1- Javascript n'est pas procédural comme tu le penses, XMLHttpRequest que tu utilises pour AJAX est un objet par exemple .
    2-
    Sauf que, la fonction XAJAX en seconde position, n'a pas l'air d'attendre la récupération des valeurs en première position, valeurs que je passe en paramètre dans l'appel de cette fonction XAJAX.
    Je ne comprend pas?
    3-
    De même pour l'instruction JavaScript, qui n'a pas l'air d'attendre la fin de l'exécution de la fonction XAJAX pour s'exécuter.
    Je suis sûr que tu travailles en mode asynchrone (ben on ne vois pas la fonction )

    A+.

  3. #3
    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
    Comme le dit Andry, l'utilisation de xajax ne te dispense pas de connaitre comment fonctionne une requête AJAX sur le client, en particulier la notion de requête asynchrone

    ajax.developpez.com/cours
    javascript.developpez.com/faq/javascript/?page=Ajax
    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

  4. #4
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    perso, je ne me suis jamais pris la tête avec les paramètres synchrones et asynchrone (j'avais essayé il y a des années au début du xhr et sauf erreur de ma part, le synchrone ne fonctionnait pas .. ou pas partout.. ou je n'ai jamais réussi à les utiliser). bref, je privilégie les fonctions de callback pour la suite des instructions. (les fonctions de callback sont implémenté dans la plupart des lib ajax autrement si tu codes toi-même ton appel, tu check l’évènement onReadyStateChange... ou un truc comme ça qui déclenchera la suite de tes instructions que tu veux synchrones.)
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Citation Envoyé par Willpower Voir le message
    j'avais essayé il y a des années au début du xhr et sauf erreur de ma part, le synchrone ne fonctionnait pas .. ou pas partout.. ou je n'ai jamais réussi à les utiliser
    Si si, ça fonctionne nickel sauf qu'on n'utilise pas un fonction callback du onreadystatechange pour récupérer le résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function modeSynchrone(){
    	var xhr = createXhr();
    	xhr.open("GET","page.php?var1=1",false);
    	xhr.send(null);
    	alert(xhr.responseText);
    }
    A+

  6. #6
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    Si si, ça fonctionne nickel sauf qu'on n'utilise pas un fonction callback du onreadystatechange pour récupérer le résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function modeSynchrone(){
    	var xhr = createXhr();
    	xhr.open("GET","page.php?var1=1",false);
    	xhr.send(null);
    	alert(xhr.responseText);
    }
    A+
    oui, j'ai testé juste après mon poste et ça fonctionnait ... juste qu'il y a moultes années quand j'avais essayé, ça n'avait pas fonctionné ! (mais j'étais un newbie en JS donc, c'était p-e moi). [/drunk]
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Apparement je me suis mal exprimé. Je reformule.

    1) mes variables eid et pid sont affectés des valeurs d'une zone de liste déroulante

    2) la fonction xajax_remplir_table(pid, eid) est appelée, il me faut donc m'assurer que les variables ont été affectées, avant l'appel de cette fonction.
    Cette fonction xajax crée un élément HTML

    3) l'instruction javascript modifie la valeur de l'attribut checked de l'élément HTML fraîchement crée. La encore, si l'instruction est exécutée avant la fin de l'exécution de la fonction xajax_remplir_table, çà ne va pas, car l'élément n'existe pas encore.

    Concernant AJAX (pas xajax), en effet je ne me suis jamais penché sur le code. J'avouerai donc ne rien comprendre à xhr et consort...
    En revanche j'ai déjà étudié (en surface) son fonctionnement, les termes de synchrone et asynchrone ne me sont pas étrangers. Si je saisis bien, c'est le caractère asynchrone de ma fonction AJAX(2) qui fait qu'elle n'attend pas la fin d'un évènement pour s'exécuter ? Et de même pour l'instruction JavaScript (3) (synchrone ?) qui elle peut attendre la fin d'un évènement synchrone, mais pas la fin d'un évènement asynchrone... C'est çà ?

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Montre nous tes codes HTML généré et la fonction AJAX.

  9. #9
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    De toutes manières à partir du moment où tu définis des timeout, tout devient asynchrone vu que cela s'exécute de manière indépendante au reste du code après un temps donné.
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  10. #10
    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
    De toute façon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout('xajax_remplir_table('+pid+', '+eid+')',100);
    ne peut pas fonctionner : lorsque le premier argument est une chaine, cette chaine est passée par eval, donc le pid et le eid ne correpondront à rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout('xajax_remplir_table(pid, eid)',100);
    est plus correct
    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

  11. #11
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Bovino Voir le message
    De toute façon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout('xajax_remplir_table('+pid+', '+eid+')',100);
    ne peut pas fonctionner : lorsque le premier argument est une chaine, cette chaine est passée par eval, donc le pid et le eid ne correpondront à rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout('xajax_remplir_table(pid, eid)',100);
    est plus correct
    Ah ben non absolument pas. pid et eid sont des variables. En tout cas çà marche parfaitement comme cela, et çà ne marche pas avec la seconde solution.

    Pour revenir au problème initial, tant pis, je vais garder cette vieille méthode des setTimeout...

    Merci à tous

  12. #12
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 662
    Points
    66 662
    Billets dans le blog
    1
    Par défaut
    setTimeout fonctione comme setInterval ... pour passer des paramètres il faut passer par une closure (fonction anonyme)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout(function(){xajax_remplir_table(pid, eid)},100);
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

Discussions similaires

  1. Pas d'exécution des instructions après boucle
    Par dubitoph dans le forum VBScript
    Réponses: 1
    Dernier message: 02/09/2013, 17h31
  2. ordre d'exécution des instructions !
    Par troumad dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/06/2012, 14h24
  3. exécuter des instruction pendant 10s
    Par eclipse2007 dans le forum MATLAB
    Réponses: 3
    Dernier message: 15/06/2009, 06h50
  4. [telnet] Exécuter des instructions en cas d'echec
    Par xjinh dans le forum Modules
    Réponses: 3
    Dernier message: 15/11/2005, 17h43
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

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