Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/03/2011, 17h37   #1
Invité régulier
 
Inscription : novembre 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 13
Points : 8
Points : 8
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 :
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
vever est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 17h58   #2
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 126
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 126
Points : 7 270
Points : 7 270
Bonsoir,

1- Javascript n'est pas procédural comme tu le penses, XMLHttpRequest que tu utilises pour AJAX est un objet par exemple .
2-
Citation:
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-
Citation:
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+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 20h06   #3
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 805
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 805
Points : 35 807
Points : 35 807
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 !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 20h13   #4
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 854
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 854
Points : 1 354
Points : 1 354
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.)
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 04h18   #5
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 126
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 126
Points : 7 270
Points : 7 270
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 :
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+
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 04h28   #6
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 854
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 854
Points : 1 354
Points : 1 354
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 :
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]
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 09h24   #7
Invité régulier
 
Inscription : novembre 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 13
Points : 8
Points : 8
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 çà ?
vever est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 10h26   #8
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 126
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 126
Points : 7 270
Points : 7 270
Montre nous tes codes HTML généré et la fonction AJAX.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 13h19   #9
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 854
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 854
Points : 1 354
Points : 1 354
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é.
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 13h27   #10
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 805
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 805
Points : 35 807
Points : 35 807
De toute façon,
Code :
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 :
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 !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 16h11   #11
Invité régulier
 
Inscription : novembre 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 13
Points : 8
Points : 8
Citation:
Envoyé par Bovino Voir le message
De toute façon,
Code :
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 :
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
vever est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 16h27   #12
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

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

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
setTimeout fonctione comme setInterval ... pour passer des paramètres il faut passer par une closure (fonction anonyme)


Code :
setTimeout(function(){xajax_remplir_table(pid, eid)},100);
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h44.


 
 
 
 
Partenaires

Hébergement Web