Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > jQuery
jQuery Forum d'entraide sur le framework jQuery. Avant de poster : Tutoriels jQuery, FAQ jQuery, Tous les tutoriels JavaScript, Toutes les FAQ 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 30/11/2010, 01h20   #1
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
Par défaut Mes fonctions ne s'exécutent pas dans l'ordre voulu

Bonjour a tous,
cela fait 2 jours que j'essaie de comprendre la raison du non fonctionnement d'une appli et je me suis rendu compte que c'est tout betement parce que les fonctions ne sont pas executées dans l'ordre que je veux:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$("#formulaire").submit(function(e) {
	if(!e.isDefaultPrevented()) {
		$.getJSON("/account/ajax/ac-get-city.php", { city: "paris" }, function(json) {
				// traitement variables
				$("#id_champ").val("valeur");
				alert("fonction 1");
			});
		});
 
		$.post(url, form.serialize(), function(msg) {	
			// mettre a jour la bdd
			alert("fonction 2");
		});
		return false; // empecher la soumission du formulaire
	}
});
et mon problème est que alert("fonction 2") s'execute et s'affiche avant le alert("fonction 1") et donc le gros souci c'est que le formulaire est soumis avant que le champ #id_champ ait la nouvelle valaur!!

please help!!
MErci beucoup
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 09h01   #2
Membre éclairé
 
sébastien courjean
Inscription : novembre 2010
Messages : 204
Détails du profil
Informations personnelles :
Nom : sébastien courjean
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : novembre 2010
Messages : 204
Points : 319
Points : 319
Effectue ton après ton
__________________
Sébastien Courjean
Développeur Web
scourjean@cyres.fr
http://www.cyres.fr/
scourjean est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 12h01   #3
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
justement non, je dois faire quelques traitement AVANT le post!!
la solution que j'ai trouvé, et qui marche bien est de rajouter un setTimeout:
Code :
1
2
3
4
5
6
...
setTimeout(function() { 
	// mettre a jour la bdd
	alert("fonction 2");
}, 2);
...
2ms sont suffisantes pour laisser le temps au premier alert de s'executer...
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 12h14   #4
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 794
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 794
Points : 35 788
Points : 35 788
Ce que tu ne semble pas vouloir comprendre, c'est qu'avec un appel AJAX, tu n'as absolument aucune garantie du temps que prendra la requête et de quelle réponse arrivera avant l'autre.
Donc
Citation:
2ms sont suffisantes pour laisser le temps au premier alert de s'executer...
est plus que périlleux comme affirmation.
__________________
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 30/11/2010, 12h27   #5
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
Citation:
Ce que tu ne semble pas vouloir comprendre, c'est qu'avec un appel AJAX, tu n'as absolument aucune garantie du temps que prendra la requête et de quelle réponse arrivera avant l'autre.
mais indépendamment de cela je veux afficher un alert("toto") AVANT le $.post avec l'appel Ajax. connais tu la raison??
dans le code que j'ai mis, je demande juste d'executer le $.post avec un delai de 2ms
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 12h51   #6
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
Bonjour,

les requêtes AJAX s'exécutant de manière asynchrone (en tache de fond) par défaut, le comportement que vous observez est tout à fait normal, le script continue de s'exécuter sans attendre le retour de vos requêtes.

Si vous souhaitez rendre vos requêtes AJAX synchrones, il faut passer par :

Code :
$.ajax({ /* Vos options */, async : false });
Il n'est pas possible de spécifier cette option avec les raccourcis AJAX fournis par jQuery ($.post, $.load, $getJSON, ...).
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 12h57   #7
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
Merci pour vos reponses.

Citation:
les requêtes AJAX s'exécutant de manière asynchrone (en tache de fond) par défaut, le comportement que vous observez est tout à fait normal, le script continue de s'exécuter sans attendre le retour de vos requêtes.
maintenant je comprends mieux

me conseillez vous alors de garder le setTimeout ou plutot changer et mettre un $.ajax ??

dans la meme fonction, j'ai plusieurs appels Ajax, doivent ils etre TOUS en $.ajax ?
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 19h49   #8
Rédacteur
 
Avatar de Arnaud F.
 
Homme Arnaud Feltz
Développeur .NET
Inscription : août 2005
Messages : 5 204
Détails du profil
Informations personnelles :
Nom : Homme Arnaud Feltz
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : août 2005
Messages : 5 204
Points : 6 113
Points : 6 113
Citation:
Envoyé par redah75 Voir le message
me conseillez vous alors de garder le setTimeout
Clairement non !!!


De manière générale, je préfère passer par $.ajax. Je suis d'accord que les méthodes fournies sont plus succintes et plus "user-friendly" mais de manière générale, ça n'est pas du tout paramétrable, on perd trop en souplesse.

Pour ma part, je préfère largement passer par des $.ajax pour justement éviter d'avoir à faire la reconversion derrière et avoir une gestion des erreurs beaucoup plus poussée.

De la même manière, si j'ai des options récurrentes, j'utilise $.ajaxSetup(); qui me garantie un socle commun pour mes requêtes AJAX.
__________________
C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

Installation de Code::Blocks sous Debian à partir de Nightly Builds
Arnaud F. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 21h39   #9
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
OK, merci beaucoup.
je vais essayer de me motiver pour chaner mes $.post en $.ajax

je pense qu'on ne peut pas melanger les $.post et $.ajax, c'est ca? si c'est le cas, est ce que l'ordre des appels ajax est respecté ??
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 09h57   #10
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 794
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 794
Points : 35 788
Points : 35 788
Citation:
je pense qu'on ne peut pas melanger les $.post et $.ajax
C'est-à-dire ?
Tu peux très bien avoir un appel $.ajax et un $.post dans le même script...
En revanche, tu ne peux pas faire plusieurs requêtes dans un appel.

Citation:
est ce que l'ordre des appels ajax est respecté ?
L'ordre des appels importe peu ! C'est l'ordre de retour qui est important et sur lequel tu ne peux pas avoir de certitude !
__________________
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 01/12/2010, 14h02   #11
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
Citation:
C'est-à-dire ?
Tu peux très bien avoir un appel $.ajax et un $.post dans le même script...
je veux dire que si je veux que les appels ajax soient executés dans l'ordre, faut il qu'il y ait que des $.ajax avec async: false; ??
j'ai par ailleurs lu dans la doc jquery ceci:
"The first letter in Ajax stands for "asynchronous," meaning that the operation occurs in parallel and the order of completion is not guaranteed. The async option to $.ajax() defaults to true, indicating that code execution can continue after the request is made. Setting this option to false (and thus making the call no longer asynchronous) is strongly discouraged, as it can cause the browser to become unresponsive."
faut il quand meme prendre le risque et utiliser l'option async??

Citation:
L'ordre des appels importe peu ! C'est l'ordre de retour qui est important et sur lequel tu ne peux pas avoir de certitude !
je commence a me perdre un peu
si par exemple j'ai 2 appels Ajax:
Code :
1
2
3
4
5
premier appel Ajax;
alert(resultat_premier_appel);
 
dexieme appel Ajax qui utilise le resultat du premier appel Ajax;
alert(resultat_deuxieme_appel);
je repose la meme question mais en reformulant
pour le bon deroulement de mon script, dois je utiliser $.ajax avec l'option async? ou plutot utiliser l'option success ??

Merci infinimenet
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 14h07   #12
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 794
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 794
Points : 35 788
Points : 35 788
Citation:
Envoyé par redah75
pour le bon deroulement de mon script, dois je utiliser $.ajax avec l'option async? ou plutot utiliser l'option success ??
Je te conseillerais plus de passer par le success.
Ceci dit, l'utilisation d'AJAX en mode synchrone est tout à fait possible, mais enlève une grande part de l'intérêt d'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 01/12/2010, 14h19   #13
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
OK, merci, je fais le necessaire et vous tiendrai au courant
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 17h29   #14
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
je bloque deja
pourriez vous svp me dire ce qui ne va pas avec ce code ?
Code :
1
2
3
4
5
6
7
8
$.ajax({
	url: url,
	data: "var1=val1&var2=val2",
	dataType: "json",
	success: function(msg){
		alert( "Data Saved: " + msg );
	}
});
quelle est la difference entre data: "var1=val1&var2=val2" et data: ({var1 : val1...}) ??

MErci
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 18h10   #15
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
c'est bon, j'ai reglé le probleme

mais par contre je ne vois toujours pas la difference entre les 2 maniere d'envoyer les données...

devrais je a votre avis gere les erreurs avec l'option error ?
si oui, quelle est la meilleure maniere de le faire?

et puis pour finir, mieux vaut il utiliser type: GET ou POST ?

Merci
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 20h26   #16
Futur Membre du Club
 
Inscription : juillet 2003
Messages : 38
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : juillet 2003
Messages : 38
Points : 19
Points : 19
Citation:
Envoyé par redah75 Voir le message
et puis pour finir, mieux vaut il utiliser type: GET ou POST ?
Peux être que ce sujet pourra répondre à ta question : ICI
Korben_Debile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 21h33   #17
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
MErci pour le lien.
je cherche au fait la difference entre GET et POST en utilisant Ajax...
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 17h18   #18
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
bon, je me crois fou en parlant avec moi meme...!!

j'ai trouvé les reponses aux questions que j'ai posées concernant les fonction et leurs ordres d'execution.

Citation:
Je te conseillerais plus de passer par le success.
Ceci dit, l'utilisation d'AJAX en mode synchrone est tout à fait possible, mais enlève une grande part de l'intérêt d'AJAX.
l'option success n'a pas l'air de faire l'affaire puisqu'elle permet pas d'attendre que la requete soit fini pour executer ce qui suit...
il me reste 2 solution:
1- utiliser l'option async: false
2- utiliser l'option complete

la quelle est la meilleure et quelle sont les avantages et inconvénients de chaque option?
redah75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2010, 12h01   #19
Rédacteur
 
Avatar de danielhagnoul
 
Homme Daniel Hagnoul
Étudiant perpétuel
Inscription : février 2009
Messages : 3 221
Détails du profil
Informations personnelles :
Nom : Homme Daniel Hagnoul
Âge : 61
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant perpétuel
Secteur : Enseignement

Informations forums :
Inscription : février 2009
Messages : 3 221
Points : 6 767
Points : 6 767
Bonjour

Avez-vous essayé d'enchaîner les appels :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$("#formulaire").submit(function(e) {
	if(!e.isDefaultPrevented()) {
		$.getJSON("/account/ajax/ac-get-city.php", { city: "paris" }, function(json) {
			// traitement variables
			$("#id_champ").val("valeur");
			alert("fonction 1");
 
			$.post(url, form.serialize(), function(msg) {	
				// mettre a jour la bdd
				alert("fonction 2");
			});
		});
 
 		return false; // empecher la soumission du formulaire
	}
});
__________________

FAQ jQuery

Mon cahier d’exercices sur jQuery & Co

Si un message vous a aidé ou vous semble pertinent, votez pour lui !
danielhagnoul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2010, 15h56   #20
Membre du Club
 
Inscription : novembre 2007
Messages : 757
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 757
Points : 44
Points : 44
merci danielhagnoul pour ta reponse.
en enchaînant les appels ca marche avec les alerts mais mon probleme c'est que a la fin, je dois retourner une valeur, et elle est souvent retournée avant qu'elle soit calculée dans les appels ajax...
redah75 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 01h53.


 
 
 
 
Partenaires

Hébergement Web