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 :

jQuery : comment renvoyer la réponse d'un appel asynchrone?


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut jQuery : comment renvoyer la réponse d'un appel asynchrone?
    Bonjour,

    Je débute avec jQuery, je veux récupérer et afficher le résultat d'une fonction ajax personnalisée qui retourne un tableau. Mais ma console me renvoie undefined.

    J'ai besoin de récupérer le résultat en dehors de ma fonction query_suggest() pour le traiter dans une boucle imbriquée.

    Comment y parvenir ?

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    function query_suggest(query, lang){
        var result;
     
        $.ajax({
            url: 'http://suggestqueries.google.com/complete/search',
            data: {
                "hl": lang,
                "ds": "",
                "q": query,
                "client": "firefox"
            },
            jsonpCallback: 'msgsJsonCallback', 
            type: 'GET',
            headers: {
                "Accept-Language": lang,
                "Accept": "application/json",
                "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0"
            },
            dataType: 'jsonp',
            success: function(data) {       
                result = data;
                return result;
     
            },
            error: function(jqXHR, textStatus, errorThrown) {
                console.log(jqXHR);
                console.log(textStatus);
                console.log(errorThrown);
            },
            cache: true
        }); 
    }
     
    var res_parent = query_suggest("chuck norris", "en");
     
    if (res_parent.length > 0) {
     
    var links = [];
     
    	for (i = 0, l = res_parent.length; i < l; i++) {
     
    		links.push({ 
    			source : "chuck norris", 
    			target : res_parent 
    		});
     
    		var child = query_suggest(res_parent[i], "en");
     
    		for (i = 0, l = res_child.length; i < l; i++) {
     
    			links.push({ 
    				source : res_parent, 
    				target : res_child
    			});		
    		}
    	}
    }

  2. #2
    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
    => http://suggestqueries.google.com/complete/search
    renvoie une erreur 400
    https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP

    donc ton appel Ajax ne revient pas sur le label success, mais sur le label error

    sauf que bien sur si tu fais un appel jors de ton serveur et qui nécessite un appel core, et dont je suis pas certain que Google soit copain pour ce coup la

  3. #3
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut
    Étonnant, aucune erreur si j'affiche le résultat dans ma console à l'intérieur de ma function.

    J'ai lu la doc, je crois avoir compris qu'il faut utiliser une promise...

  4. #4
    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
    Code JavaScript : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    function query_suggest(query, lang){
     
      return new Promise(function(resolve, reject){
     
        $.ajax({
          url: 'http://suggestqueries.google.com/complete/search',
          type: 'GET',
          dataType: 'jsonp',            
          data: {
              "hl": lang,
              "ds": "",
              "q": query,
              "client": "firefox"
          },
          cache: true,
          jsonpCallback: 'msgsJsonCallback', 
          headers: {
              "Accept-Language": lang,
              "Accept": "application/json",
              "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0"
          },
     
          success: function(data) {       
              resolve(data);
     
          },
          error: function(jqXHR, textStatus, errorThrown) {
              console.log(jqXHR);
              console.log(textStatus);
              console.log(errorThrown);
              reject('erreur');
          }
        });  ///ajax
      }); ///Promise
    }
     
    var res_parent = '';
     
    function appel_Prommesse_Ajax() {
      query_suggest("chuck norris", "en")
          .then(function (reponse) {
            res_parent = reponse;
          })
          .catch(function (error) {
            res_parent = '';
              console.log(error);
          });
    };

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Bonjour,
    Citation Envoyé par la_chouette
    Mais ma console me renvoie undefined.
    il ne faut pas oublier qu'Ajax est asynchrone, par défaut, donc le résultat n'est pas disponible immédiatement.


    Citation Envoyé par la_chouette
    je crois avoir compris qu'il faut utiliser une promise...
    Comme tu utilises un dataType: 'jsonp' il te faut traiter le résultat dans la fonction callback que tu as déclaré sur cette ligne jsonpCallback: fctCallBack,.

    Ton code pourrait se résumer à
    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
    25
    26
    27
    28
    29
    // c'est ici qu'il faut faire le boulot par exemple
    function msgsJsonCallback(data) {
      var oList = $("#liste");
      $.each(data[1], function (key, value) {
        oList.append("<li>" + value);
      });
    }
     
    function query_suggest(query, lang) {
      var result;
      $.ajax({
        url: 'http://suggestqueries.google.com/complete/search',
        data: {
          "hl": lang,
          "ds": "",
          "q": query,
          "client": "firefox"
        },
        jsonpCallback: "msgsJsonCallback",
        type: 'GET',
        dataType: 'jsonp',
        error: function (jqXHR, textStatus, errorThrown) {
          console.log("error : ", textStatus, jqXHR);
        },
        cache: true
      });
    }
    // appel fonction
    query_suggest("chuck norris", "en", "callBackMain");
    Ce qui me trouble le plus est que visiblement tu souhaites « boucler » sur les sous rubriques en relançant les requêtes pour chaque item reçu, dans quel but !

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/01/2014, 11h55
  2. Réponses: 6
    Dernier message: 30/07/2010, 15h08
  3. [JQUERY] Comment appeler une fonction php avec jquery
    Par popogendarme dans le forum jQuery
    Réponses: 1
    Dernier message: 20/03/2007, 16h07
  4. [VB.Net] Comment renvoyer un SQLDataReader par un service Web ?
    Par moufles03 dans le forum Services Web
    Réponses: 4
    Dernier message: 13/07/2004, 11h55
  5. [VB6] comment renvoyer un exit code en VB6 ?
    Par VVE dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 13/05/2004, 13h30

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