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 :

retour de fonction en attente de defered/resolve


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 7
    Par défaut retour de fonction en attente de defered/resolve
    Bonjour,

    Encore un petit problème sous jQuery avec les defered/resolv, etc...

    Soit une function "get_infos" qui récupère des informations provenant d'une requête 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
    maClasse.get_infos=function() {
    
    	this.dfd_get_infos=jQuery.Deferred();
    	this.get_infosPromise= this.dfd_get_infos.promise();
    
    	var _self=this;
    
    	jQuery.ajax(
    		url: ...,
    		data: ...,
    		success:function(){
    			NAS_CRYPTO=data[0], // initialisation du mode de cryptage du serveur
    			...
    			_self.dfd_get_infos.resolve(); // On résoud
    		},
    		error: function(){
    			...
    			_self.dfd_get_infos.reject(); // On rejette
    		},
    		...
    	)
    	return this.get_infosPromise; // On retourne le promise
    }
    Ces informations sont de plusieurs natures et peuvent être publiques (ie. modifiables au sein de ma "classe", donc finalement des propriétés de maClasse) ou privées (ie. non modifiables au sein de la classe, juste "visualisables"). Pour ces dernières, il faut donc que je donne un accès à ces valeurs par des functions..., par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	maClasse.get_crypto = function () { // un cryptage est actif sur le serveur ou non... 
    
    		// On attend un premier retour de get_infos
    		maClasse.dfd_get_infos.done(function() { /
    			return NAS_CRYPTO; // NAS_CRYPTO est une variable privée dans le namespace en cours, et préalablement initialisée par get_infos (voir plus haut), ceci fonctionne très bien, mais "trop tard"
    		});
    
    		return NAS_CRYPTO; // Hé oui, c'est là que ça ne va pas :-(
    
    	};
    Cette fonction est appelée par quelque chose qui ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Instanciation 
    toto=maClasse;
    toto.get_infos(); // requête asynchrone
    // Y'a t'il un cryptage en cours
    cryptage=toto.get_crypto(); // retour "undefined" car le retour de get_infos au dessus n'est pas encore finalisé...
    ...
    Pour dire les choses simplement il faudrait que je demande à la fonction maClasse.get_crypto d'attendre le retour de la requête "get_infos" (donc le moment où "maClasse.dfd_get_infos.done()) AVANT de renvoyer la variable "NAS_CRYPTO"... Donc que je "l'asservisse"...

    Je n'ai pas pu trouver d'exemple ou de moyen de faire cela, ce qui me fait même douter du bien fondé de la démarche...

    Merci pour votre aide...

    Bonne journée

  2. #2
    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 : 75
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 7
    Par défaut
    Bonjour,

    Merci pour ce lien vers la FAQ (que j'avais bien déjà pris en compte)... C'est actuellement implémenté comme ça (j'ai bien un objet deferred "this.dfd_get_infos" retourné par "maClasse.get_infos") et ça fonctionne très bien à ce niveau ("maClasse.dfd_get_infos.done" est bien déclenchée dans "maClasse.get_crypto")

    Mon soucis reste "d'asservir" le retour d'une autre function à la résolution de cet objet Deferred... La function "maClasse.get_crypto" ne doit pas retourner de valeur tant que l'objet Defered "maClasse.dfd_get_infos" n'est pas Resolve/Reject...

    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
    	maClasse.get_crypto = function () { // Permet de savoir si un cryptage est-il actif sur le serveur ou non ?
     
    		// On attend un premier retour de get_infos (donc de l'objet "dfd_get_infos" retourné par "get_infos")
    		maClasse.dfd_get_infos.done(function() {
    			/* C'est Ok ici, mais il faudrait que ce soit
    			la function "maClasse.get_crypto" (ie. la parente)
    			qui retourne cette valeur, et PAS la function
    			en attente de Resolve ("maClasse.dfd_get_infos.done ici") */
    			return NAS_CRYPTO;
     		});
    		/* Ce return est effectué dès l'appel de la function "maClasse.get_crypto"...
    		C'est lui que je voudrais "asservir" (mettre en attente) de
    		"maClasse.dfd_get_infos.done"
    		*/
    		return NAS_CRYPTO; 
     
    	};
    Il ne s'agit pas d'un problème de chaînage Deferred/resolve mal géré (enfin, je le crois ).

    Je n'ai pas vu dans cette article de la FAQ (ou par ailleurs) de possibilité de faire cela (où alors je ne vois pas comment "adapter" à mon besoin ?).

    Merci encore et bonne journée

  4. #4
    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 : 75
    Localisation : Belgique

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

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

    Une transaction AJAX est asynchrone, c'est déjà un objet différé qui génère une promesse, donc je suggère de revoir la structure de votre code. Exemple (transaction JSON ou autre, voir : http://javascript.developpez.com/faq...ax#AjaxRequest) :

    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
    var NAS_CRYPTO = null,
    	jqXHR = $.getJSON( "fichier.php" );
     
    jqXHR.done( function( data, textStatus, jqXHR ){
    	// succès de la transaction, on doit traiter le contenu de data
    	console.log( data, textStatus, jqXHR );
     
    	// votre code
    	NAS_CRYPTO = data[0];
     
    });
     
    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
    	console.log( jqXHR, textStatus );
     
    	/*
    	 * Si la valeur existe
    	 */
    	if ( NAS_CRYPTO ){
    		// votre code dépendant de la valeur
    	}
    });

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  5. #5
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 7
    Par défaut
    Bonjour,

    Merci de votre réponse. Je sais qu'une requête ajax est asynchrone et, justement, je crée un objet Deferred qui attend que cette requête ajax soit résolue. Je pense que ce que vous proposez est déjà pris en charge par ma méthode "maClasse.get_infos" et tout se passe bien à ce niveau (ie. je peux récupérer les datas du serveur en traitant les callbacks et en gérant les éventuelles erreurs).

    Citation Envoyé par danielhagnoul Voir le message
    // Ceci est fait par ailleurs dans ma classe
    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
    var NAS_CRYPTO = null,
    	jqXHR = $.getJSON( "fichier.php" );
    
    // Ceci est pris en charge par maClasse.get_infos + requête ajax + sucess/error, etc.
    jqXHR.done( function( data, textStatus, jqXHR ){
    	// succès de la transaction, on doit traiter le contenu de data
    	console.log( data, textStatus, jqXHR );
    	
    	// votre code
    	NAS_CRYPTO = data[0];
    
    	// cf : maClasse.get_infos
    
    });
    // Ceci est pris en charge par maClasse.get_infos + requête ajax + sucess/error, etc.
    qXHR.fail( function( jqXHR, textStatus, errorThrown ){
    	// échec de la transaction, gérer la catastrophe
    	console.log( jqXHR, textStatus, errorThrown );
    							
    });
    // Ceci est pris en charge par maClasse.get_infos + requête ajax + sucess/error, etc.
    
    qXHR.always( function( jqXHR, textStatus ){
    	// la transaction est terminée
    	console.log( jqXHR, textStatus );
    	
    	/*
    	 * Si la valeur existe
    	 */
    	if ( NAS_CRYPTO ){
    		// votre code dépendant de la valeur
    	}
    });
    Il s'agit d'une classe qui sera à terme utilisée par d'autres Dév de la manière suivante :
    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
    // Instanciation 
    toto=maClasse;
    toto.get_infos(); // requête asynchrone
    /*
    Par exemple, j'ai su faire patienter cette méthode car elle utilise elle-même
    une requête ajax qui ne sera lancée que si l'objet "maClasse.dfd_get_infos" est correctement résolu
    */
    toto.login("login", "password", ...) ;
    // Mais cette métthode n'utilise pas de requête ajax et je ne sais pas la faire patienter :-(
    cryptage=toto.get_crypto(); // retour "undefined" car le retour de get_infos au dessus n'est pas encore finalisé
    if (cryptage) {
    ...
    }
    version_server=toto.get_verserv;
    ...
    Je sais faire patienter les requêtes ajax suivantes en utilisant, justement l'objet Deferred "maClasse.dfd_get_infos" retourné par get_infos (gestion de file d'attente de requêtes basée sur cet objet Deferred).

    La seule chose qu'il me reste à faire et de trouver comment faire patienter une function qui n'utilise pas de requête ajax elle-même...

    Merci encore de vos efforts et bonne journée

Discussions similaires

  1. Perte de type en retour de fonction
    Par Bebel dans le forum Langage
    Réponses: 8
    Dernier message: 22/12/2005, 12h54
  2. [syntaxe] tableau et retour de fonction
    Par BainE dans le forum C++
    Réponses: 4
    Dernier message: 08/12/2005, 16h01
  3. Retour de fonction en C
    Par troumad dans le forum Linux
    Réponses: 2
    Dernier message: 06/11/2005, 21h43
  4. Utilisation d'un retour de fonction dans un decode
    Par CFVince dans le forum Oracle
    Réponses: 4
    Dernier message: 20/10/2005, 17h22
  5. Référence en retour de fonction, à transformer en hash
    Par raoulchatigre dans le forum Langage
    Réponses: 4
    Dernier message: 15/07/2005, 14h24

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