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 :

Attendre la fin d'exécution de la fonction Ajax


Sujet :

jQuery

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 54
    Par défaut Attendre la fin d'exécution de la fonction Ajax
    J'ai une focntion contenant de l'ajax et j'aimerai sortir de la fonction lors du resultat de l'ajax.
    Mon 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
    function ma_fonction {
    $.ajax({
                url: "test.php",
                type: "POST",
                data: {
                    param1: "pouet",
                    param2: "truc"
                },
                success: function(response) {
                    var result = $.trim(response);
     
                    //divers traitements
     
                    //sortie
                }
            });
    }
    L'intérêt est dde sortir au niveau du commentaire "sortie" de façon à être certain que l'ajax soit terminé au moment où on sort de la fonction.

    C'est peut être bête mais là je tourne en rond

    une idée ?

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 513
    Par défaut
    edit : tu as oublié les parenthèses juste après ma_fonction()
    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
     
    function ma_fonction() {
    $.ajax({
                url: "test.php",
                type: "POST",
                data: {
                    param1: "pouet",
                    param2: "truc"
                },
                success: function(response) {
                    var result = $.trim(response);
     
                    //divers traitements
     
                    //sortie
                }
            })
            .done(function(d){
                console.log("done :"+d);
               //ajax s'est terminé avec succès
              // ton code ici ...
            });
    }

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 54
    Par défaut
    Merci pour l'idée mais comme le "done" est une fonction, si je fait un "return", ça ne sort pas de la fonction mère mais de la fonction du "done"

  4. #4
    Membre expérimenté
    Homme Profil pro
    Collégien
    Inscrit en
    Mai 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 116
    Par défaut
    Bonjour, peut être qu'une bonne idée serait d'utiliser le mode synchrone de ajax, ici tu n'as pas d'intérêt d'être asynchrone vu que tu veux attendre que la requête soit finis


    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
    ma function = function(){
    var myresut = "";
    $.ajax({
        url: "",
        type: "POST",
        async: false, // Mode synchrone
        data: ({}),
         success : function(){  
     
             myresut = "OK"
         }
    });
     
    return myresut 
     
    }

  5. #5
    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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    Les focntion sont exécutées en bulle, et chronologiquement le return en fin de fonction ne donnera pas le résultat escompté car la variable ne sera pas modifié par le success avant le return ...

    Essaye un return de l'ajax
    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
     
    function ma_fonction() {
    return  $.ajax({
                url: "test.php",
                type: "POST",
                data: {
                    param1: "pouet",
                    param2: "truc"
                },
                success: function(response) {
                    var result = $.trim(response);
     
                    //divers traitements
     
                    //sortie
                }
            })
            .done(function(d){
                console.log("done :"+d);
               //ajax s'est terminé avec succès
              // ton code ici ...
            return "foo";
            });
    }
    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 !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    sauf erreur, on ne mélange pas .success et .done : jQuery.ajax() - exemples

    Deprecation Notice:
    The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks are removed as of jQuery 3.0.
    You can use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

  7. #7
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    Un appel Ajax, c'est de l'asynchrone, alors il n'y a pas 36 solutions, soit tu utilises un callBack, soit tu passes par les promesses.

  8. #8
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par défaut
    Bonjour,

    Citation Envoyé par ben01n Voir le message
    L'intérêt est dde sortir au niveau du commentaire "sortie" de façon à être certain que l'ajax soit terminé au moment où on sort de la fonction.
    je comprends ton besoin, mais le langage JavaScript n’est pas vraiment fait pour ça, tu essayes de le plier dans le mauvais sens. Tu peux y arriver si tu forces, mais le résultat ne sera pas propre.

    Citation Envoyé par Chuck 3.50 Voir le message
    Bonjour, peut être qu'une bonne idée serait d'utiliser le mode synchrone de ajax
    C’est une idée intuitive certes, mais ce n’est pas une bonne idée. L’ajax synchrone est déprécié, car en cas de mauvaise connexion, il cause un gel de l’interface.

    Au-delà d’une pratique de codage, c’est le concept même de requête asynchrone qu’il faut comprendre : ta fonction ma_fonction lance sa requête ajax, et termine sans attendre la réponse. C’est le comportement normal de JavaScript.

    Si tu veux absolument pouvoir agir sur une valeur renvoyée par ma_fonction, renvoie directement la valeur de $.ajax( ... ), c’est un objet jqXHR qui implémente les méthodes .done(), .fail() et .always().

    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
    function ma_fonction() {
        return $.ajax({
            url: "test.php",
            method: "POST", // il faut arrêter d’utiliser `type`, trop facile de confondre avec `dataType`
            data: {
                param1: "pouet",
                param2: "truc"
            }
        });
    }
     
    // ailleurs dans le code
    // ...
     
    var jqXHR = ma_fonction();
    jqXHR.done(function(response) {
        var result = $.trim(response);
     
        //divers traitements
     
        //sortie
    });
    Je vais me répéter, avec une autre métaphore à deux sous () : vouloir faire de l’ajax synchrone, c’est aller contre le vent. On pense que c’est plus simple, mais en n’apprenant jamais un des concepts majeurs du langage, on s’interdit de comprendre tous les tutos et les exemples de code qui parlent de ça. C’est une fausse facilité.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  9. #9
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Je vais me répéter, avec une autre métaphore à deux sous () : vouloir faire de l’ajax synchrone, c’est aller contre le vent. On pense que c’est plus simple, mais en n’apprenant jamais un des concepts majeurs du langage, on s’interdit de comprendre tous les tutos et les exemples de code qui parlent de ça. C’est une fausse facilité.
    moi, je la trouve très bien cette amphore à 2 sous, et je dirais même plus, parce que je suis Breton, qu'ici, on à un dicton avec les cap-horniers :ceux la on le droit de pisser contre le vent 'sans qu'on ce moque d'eux), il n’empêche, ils se pissent quand même dessus (et il y a un sens profond derrière cette boutade).

  10. #10
    Membre expérimenté
    Homme Profil pro
    Collégien
    Inscrit en
    Mai 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 116
    Par défaut
    Oui je suis d'accord avec toi, tant que la requête n'est pas retourner on peut toujours afficher un loader sur le site par exemple !
    c'est vrai que j'ai répondu un peu bêtement à la question pour répondre à un besoin précis qui est "une fonction qui doit retourner le résultat d'une requête ajax",
    mais en effet le mieux pour l'auteur de ce sujet c'est de repenser ce qu'il a envie de faire en utilisant les promesses / des loaders dans l'interface etc ...

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