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

jQuery Discussion :

Mes fonctions ne s'exécutent pas dans l'ordre voulu


Sujet :

jQuery

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    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 : 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
    $("#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

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 207
    Points : 344
    Points
    344
    Par défaut
    Effectue ton après ton

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  4. #4
    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
    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
    2ms sont suffisantes pour laisser le temps au premier alert de s'executer...
    est plus que périlleux comme affirmation.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    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

  6. #6
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $.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, ...).

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    Merci pour vos reponses.

    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 ?

  8. #8
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    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.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    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é ??

  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
    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.

    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 !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    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??

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  12. #12
    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
    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.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    OK, merci, je fais le necessaire et vous tiendrai au courant

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    je bloque deja
    pourriez vous svp me dire ce qui ne va pas avec ce code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    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

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    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

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    MErci pour le lien.
    je cherche au fait la difference entre GET et POST en utilisant Ajax...

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    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.

    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?

  19. #19
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Bonjour

    Avez-vous essayé d'enchaîner les appels :
    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
    $("#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
    	}
    });

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 901
    Points : 79
    Points
    79
    Par défaut
    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...

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/09/2008, 11h25
  2. Le script serveur ne s'exécute pas dans une page aspx.
    Par laurent_diep dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/02/2007, 21h27
  3. Réponses: 4
    Dernier message: 11/09/2006, 17h46
  4. [VB6 débutant] mes projets ne s'exécutent pas
    Par beegees dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 09/09/2006, 09h50
  5. La fonction CurrentDb() ne fonctionne pas dans une requête
    Par Sébastien Le Goyet dans le forum Access
    Réponses: 8
    Dernier message: 24/11/2005, 17h46

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