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 :

Récupérer le résultat d'une fonction dans une variable


Sujet :

jQuery

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut Récupérer le résultat d'une fonction dans une variable
    Bonjour,

    Je recherche à récupérer le résultat d'une fonction dans une variable JS :


    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
    function PHPSESSID ()
    {
        $.ajax({
            type: 'POST',
            url: 'ajax/PHPSESSID.php',
            dataType: 'text',
            success: function (result)
            {
                return result;
            }
        });
    }
     
    function ChargerGestionnaireImage ()
    {
        var vPHPSESSID = PHPSESSID();
        alert(vPHPSESSID);
    }
    C'est possible ou je m’embête pour rien ?

    Merci

  2. #2
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    as tu testé ?

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    as tu testé ?
    Of course :

    Le résultat renvoyé par la popup est "undefined" et j'ai un message d'erreur dans la console :

    Uncaught TypeError: Cannot call method 'toString' of undefined

  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 : 54
    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
    Traité je ne sais combien de fois...
    Un classique AJAX : utiliser les données au bon moment !.

  5. #5
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    $.ajax porte tres mal son nom car il ne s'agit pas d'AJAX mais de l'utilisation de XMLHttpRequest

    la seule solution qui permet de récupérer la variable est d'utiliser XMLHttpReques en mode Synchrone.

    on se retrouve donc avec un $.ajax qui fait un appel http synchrone et qui n'utilise pas XML
    Pour un Asynchronous Javascript And Xml il ne reste pas grand chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    xhr_object.open("GET", location.href, false); 
    xhr_object.send(null); 
    if (xhr_object.readyState == 4) {
     maVariable = xhr_object.responseText
    }
    A+JYT

  6. #6
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Citation Envoyé par sekaijin Voir le message
    la seule solution qui permet de récupérer la variable est d'utiliser XMLHttpReques en mode Synchrone.
    Euh quoi ? Et les callbacks, listeners, promises et autres joies de la programmation asynchrone ?

    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 PHPSESSID (callback)
    {
        $.ajax({
            type: 'POST',
            url: 'ajax/PHPSESSID.php',
            dataType: 'text',
            success: callback
        });
    }
     
    function ChargerGestionnaireImage ()
    {
        PHPSESSID(function(vPHPSESSID){
            alert(vPHPSESSID);
        });
    }

  7. #7
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    les appel aschynchrone ne permettent pas de récupérer le résultat
    Ils permettent de positionner un handler qui lui récupèrera le résultat de l'appel

    La seule et unique façon de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function appellerUneFonctionCôteServeur() {
      ...
    }
    var resultDUnAppleServeur = appellerUneFonctionCôteServeur();
    est d'en passer par un appel synchrone.

    Si on utilise si souvent l'appel asynchrone c'est bien parce que l'appel synchrone est contraignant : le client est bloqué le temps de l'appel, jusqu'à l'arrivé de la réponse.

    Il ne faut donc l'utiliser en connaissance de cause.

    sinon l'écriture est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function envoyerUneRequeteAuServeur() {
       ...
       success: attendreUneReponceDuServeur
    }
    function attendreUneReponceDuServeur() {
      resultDUnAppleServeur = ...
    }
    envoyerUneRequeteAuServeur();
    //on n'a pas récupéré le résultat
    console.log(resultDUnAppleServeur); //Emty
    //lorsque la réponse arrivera la fonction attendreUneReponceDuServeur la recevra.
    //mais pas cette section de code.
    A+JYT

  8. #8
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    D'accord ce que tu veux dire, c'est que les appels asynchrones ne permettent pas de récupérer le résultat directement au retour de la fonction faisant l'appel.
    Ta phrase pouvait laisser croire par erreur qu'on ne peut pas en AJAX enregistrer la réponse du serveur dans une variable dans le même scope que la fonction d'appel.

    A noter qu'il y a plusieurs projets de langages basés sur JS pour arriver à retrouver une "syntaxe synchrone pour des appels asynchrones". Un exemple ici : http://www.mobl-lang.org/283/reducin...s-programming/

    Je ne suis pas fan du tout de ce genre de solutions, qui ont tendance à masquer le fonctionnement réel du code et à rendre le debug impossible.

  9. #9
    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 : 74
    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
    retrouver une "syntaxe synchrone pour des appels asynchrones"
    Oui, il faut utiliser les transactions asynchrones avec les promesses et l'objet différé jqXHR (XMLHttpRequest).

    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
    var str = $( "#formID" ).serialize(),
    	    jqXHR = $.post( "monFichier.php", str, "text" );
     
    	jqXHR.done( function( data, textStatus, jqXHR ){
    		// succès de la transaction, on doit traiter le contenu de data
    		console.log( data, textStatus, jqXHR );
     
    	});
     
    	jqXHR.fail( function( jqXHR, textStatus, errorThrown ){
    		// échec de la transaction, gérer la catastrophe
    		console.log( jqXHR, textStatus, errorThrown );
     
    	});
     
    	jqXhr.always( function( jqXHR, textStatus ){
    		// la transaction est terminée (échec ou succès)
    		console.log( jqXhr, textStatus );
    	});
    Idem avec $.ajax(), voir : http://api.jquery.com/jQuery.ajax/.

    Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks will be deprecated in jQuery 1.8. To prepare your code for their eventual removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

    // Assign handlers immediately after making the request,
    // and remember the jqxhr object for this request
    var jqxhr = $.ajax( "example.php" )
    .done(function() { alert("success"); })
    .fail(function() { alert("error"); })
    .always(function() { alert("complete"); });

    // perform other work here ...

    // Set another completion function for the request above
    jqxhr.always(function() { alert("second complete"); });

  10. #10
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    J'ai écrit cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function PHPSESSID ()
    {
        var request = $.ajax({
            url: "ajax/PHPSESSID.php",
            type: "POST",
            dataType: "html"
        });
     
        return request.done();
     
    }
    Existe t'il un moyen pour qu'il renvoi le résultat via le done() (car il me retourne que l'objet )?

  11. #11
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    encore une fois la question a se poser N'EST PAS comment récupérer le résultat

    Mais que veux-tu faire de ce résultat.

    très souvent on s'apperçois en regardant plus large que la solution est toute simple.

    tu ne nous as pas exposé ton problème mais le point bloquant d'une solution que tu as envisagé pour ce problème.

    expose le problème et on pouras peut-être t donner d'autre solution qui ne nécessite pas de récupérer la valeur du résultat à l'appel.

    A+JYT

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Récupérer variable d'une fonction dans une fonction
    Par ForceFlo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/10/2013, 22h47
  3. [XSLT 1.0] Mettre le résultat de l'appel d'une fonction dans une variable
    Par Giovanny Temgoua dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 16/01/2012, 17h47
  4. [AC-2003] Récupérer le résultat de ma fonction dans une requête access
    Par PASINFO dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/09/2010, 19h07
  5. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04

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