Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/12/2011, 10h32   #1
Membre du Club
 
Inscription : mai 2009
Messages : 234
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 234
Points : 53
Points : 53
Par défaut Partage de variable entre fonction

Bonjour à tous,

Voilà, j'ai un script js me permettant de récupérer via ajax (j'utilise jQuery pour plus de facilité) une valeur que je doit ensuite mettre dans un attribut de l'objet duquel découle cette même fonction.
L'ennui, c'est que JS n'arrive pas à faire une chose pareil. Serais-ce une histoire de callback ? (pas bien compris le principe).

Mon script :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
var monObj = function(){
    var maVar = null; // Attribut privé à changer
 
    sendAjaxRequest     = function(){
        $.ajax({
            url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"monfichierserver.php",
            type        : "POST",
            data        : "bla=blabla",
            cache       : false,
            success     : function(valR){
                if(valR!==0 && valR!==null){
                    maVar         = valR;
                }
            }
        });
 
        return (maVar!==null); // CE TEST VAUT FALSE !!!
    }
};
En gros, l'attribut maVar doit se faire remplacer par le résultat de ma requette, mais impossible...
Je précise que le problème ne viens pas d'ajax qui me retourne la bonne valeur comme prévu. Je n'arrive juste pas bien a comprendre la portée des variables en objet dans js...

D'avance merci pour votre aide...
__________________
Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...
FotoXe33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 10h57   #2
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 069
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 069
Points : 45 202
Points : 45 202
essaye de attacher ta variable à la fonction ..
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var monObj = function(){
    this.maVar = null; // Attribut privé à changer
 
    sendAjaxRequest     = function(){
        $.ajax({
            url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"monfichierserver.php",
            type        : "POST",
            data        : "bla=blabla",
            cache       : false,
            success     : function(valR){
                if(valR!==0 && valR!==null){
                    monObj.maVar         = valR;
                }
            }
        });
 
        return (nomObj.maVar!==null); // CE TEST VAUT FALSE !!!
    }
};
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 11h04   #3
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 808
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 808
Points : 35 793
Points : 35 793
Ben surtout, attends d'avoir récupéré la valeur avant d'essayer de l'affecter...
Un classique AJAX : utiliser les données au bon moment !

Citation:
JS n'arrive pas à faire une chose pareil

Ce serait pas plutôt : "je n'arrive pas à faire une chose pareille avec JS" ?
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 11h11   #4
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 069
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 069
Points : 45 202
Points : 45 202
ha oui le return dans le success ^^
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 11h27   #5
Membre du Club
 
Inscription : mai 2009
Messages : 234
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 234
Points : 53
Points : 53
Merci à vous deux.

Citation:
Envoyé par Bovino

Ce serait pas plutôt : "je n'arrive pas à faire une chose pareille avec JS" ?
En effet :p

@SpaceFrog : Si je fais ce que tu préconise, maVar n'est alors plus un attribut privé et se voi donc accessible et modifiable a l'extérieur de l'objet, ce que je ne souhaite absolument pas...
De plus, il me semble que faire un return dans une fonction anonyme est déprécié...

@Bovino : Merci pour le lien. Il est vrai que je fais (hélas) encore ce genre d'erreur de base... Que préconises-tu dans ce contexte alors ? Car mettre l'instruction ajax dans une autre fonction serait juste inutile à mon sens puisque j'en ai besoin uniquement pour cette fonction.


Plus généralement, travaillant avec Komodo Edit, ce dernier m'a indiqué le problème de return dans le success ajax. Est-ce un réel problème ? Quels changements implique ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
var monObj = function(){
    var maVar = null; // Attribut privé à changer
 
    sendAjaxRequest     = function(){
        $.ajax({
            url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"monfichierserver.php",
            type        : "POST",
            data        : "bla=blabla",
            cache       : false,
            success     : function(valR){
                return (valR!==0 && valR!==null) ? valR : null;
            }
        });
 
        // Je met quoi ici ? maVar = valR; ou maVar = avant le $.ajax ?
 
        return (maVar!==null); // CE TEST VAUT FALSE !!!
    }
};
D'avance merci...
__________________
Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...
FotoXe33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 13h02   #6
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 872
Points : 1 381
Points : 1 381
Citation:
Envoyé par FotoXe33 Voir le message
Bonjour à tous,

Voilà, j'ai un script js me permettant de récupérer via ajax (j'utilise jQuery pour plus de facilité) une valeur que je doit ensuite mettre dans un attribut de l'objet duquel découle cette même fonction.
L'ennui, c'est que JS n'arrive pas à faire une chose pareil. Serais-ce une histoire de callback ? (pas bien compris le principe).

Mon script :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
var monObj = function(){
    var maVar = null; // Attribut privé à changer
 
    sendAjaxRequest     = function(){
        $.ajax({
            url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"monfichierserver.php",
            type        : "POST",
            data        : "bla=blabla",
            cache       : false,
            success     : function(valR){
                if(valR!==0 && valR!==null){
                    maVar         = valR;
                }
            }
        });
 
        return (maVar!==null); // CE TEST VAUT FALSE !!!
    }
};
En gros, l'attribut maVar doit se faire remplacer par le résultat de ma requette, mais impossible...
Je précise que le problème ne viens pas d'ajax qui me retourne la bonne valeur comme prévu. Je n'arrive juste pas bien a comprendre la portée des variables en objet dans js...

D'avance merci pour votre aide...
essaye simplement d'ajouter à ton code initial, le paramètre async : false à ta requête ajax. (je pense que ça devrait résoudre ton problème, même si les requêtes synchrones ne sont pas ce qu'il y a de mieux puisqu'elles bloquent ton code jusqu'à l'obtention d'une réponse.)
Willpower est actuellement connecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/12/2011, 15h01   #7
Membre expérimenté
 
Duke Jikel
Inscription : mai 2010
Messages : 340
Détails du profil
Informations personnelles :
Nom : Duke Jikel

Informations forums :
Inscription : mai 2010
Messages : 340
Points : 548
Points : 548
Citation:
Envoyé par Willpower Voir le message
essaye simplement d'ajouter à ton code initial, le paramètre async : false à ta requête ajax. (je pense que ça devrait résoudre ton problème, même si les requêtes synchrones ne sont pas ce qu'il y a de mieux puisqu'elles bloquent ton code jusqu'à l'obtention d'une réponse.)
Une méthode qui fait de l'ajax est asynchrone, donc elle ne doit pas retourner de valeur, mais plutôt appeler une methode de callback qui recevra cette valeur en paramètre.
dukej est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 15h17   #8
Membre du Club
 
Inscription : mai 2009
Messages : 234
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 234
Points : 53
Points : 53
Citation:
Envoyé par Willpower Voir le message
essaye simplement d'ajouter à ton code initial, le paramètre async : false à ta requête ajax. (je pense que ça devrait résoudre ton problème, même si les requêtes synchrones ne sont pas ce qu'il y a de mieux puisqu'elles bloquent ton code jusqu'à l'obtention d'une réponse.)
Ah oui pas bête, à tester...

Citation:
Envoyé par dukej Voir le message
Une méthode qui fait de l'ajax est asynchrone, donc elle ne doit pas retourner de valeur, mais plutôt appeler une methode de callback qui recevra cette valeur en paramètre.
Oui c'est ce que je souhaitais faire à la base mais j'avoue ne pas avoir tout compris du callback :/ J'vais me taper un p'tit tutos et essayer de voir ça...
__________________
Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...
FotoXe33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 15h37   #9
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 872
Points : 1 381
Points : 1 381
ce qu'on appelle "callback" n'est autre que la fonction qu'on exécute lorsqu'on reçoit la réponse du serveur.

dans ton cas :

Code :
1
2
3
4
5
 success     : function(valR){
                if(valR!==0 && valR!==null){
                    maVar         = valR;
                }
            }
EST la fonction de callback. c'est à partir de là que tu dois déclencher les mises à jour de ta page.
Willpower est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 17h13   #10
Membre du Club
 
Inscription : mai 2009
Messages : 234
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 234
Points : 53
Points : 53
Dans mon cas impossible...

Quant à async : false, marche pas :/
__________________
Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...
FotoXe33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 17h16   #11
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 069
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 069
Points : 45 202
Points : 45 202
il suffit de faire le return dans le success ...
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 17h31   #12
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 808
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 808
Points : 35 793
Points : 35 793
Citation:
Envoyé par SpaceFrog
il suffit de faire le return dans le success ...
Code :
success: function(){...}
Non, ce n'est pas possible, si tu mets le return dans le callback success, c'est la fonction anonyme qui va renvoyer sa réponse, donc pas la fonction de départ (d'ailleurs, celle-ci à logiquement terminé son exécution).

@FotoXe33 : si pour toi attendre la réponse du serveur n'est pas une option possible, ni en synchrone ni en asynchrone, il te reste plus qu'à te tirer une balle dans le sexe !
Plus sérieusement, il doit y avoir une solution, mais pour t'aider, il faudrait nous en dire plus sur ce que tu cherches à faire...
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 19h42   #13
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 872
Points : 1 381
Points : 1 381
Citation:
Envoyé par FotoXe33 Voir le message
Dans mon cas impossible...
quoi donc ? la solution du callback ? tu souhaites donc que ta fonction soit blocante en attendant la réponse ? donc synchrone (async:false) ?

Citation:
Envoyé par FotoXe33 Voir le message
Quant à async : false, marche pas :/
Attention de ne pas mélanger les différentes solutions qu'on t'as proposé, pour l'ajout du paramètre async:false je t'ai bien précisé de reprendre ton code initial. (donc avec modification de variable et non retour dans la fonction succes) :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var monObj = function(){
    var maVar = null; // Attribut privé à changer
 
    sendAjaxRequest     = function(){
        $.ajax({
            url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"monfichierserver.php",
            type        : "POST",
            data        : "bla=blabla",
            cache       : false,
            async       : false,
            success     : function(valR){
                if(valR!==0 && valR!==null){
                    maVar         = valR;
                }
            }
        });
 
        return (maVar!==null); // CE TEST VAUT FALSE !!!
    }
};
Willpower est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 20h34   #14
Membre du Club
 
Inscription : mai 2009
Messages : 234
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 234
Points : 53
Points : 53
Citation:
Envoyé par Bovino Voir le message
@FotoXe33 : si pour toi attendre la réponse du serveur n'est pas une option possible, ni en synchrone ni en asynchrone, il te reste plus qu'à te tirer une balle dans le sexe !
Plus sérieusement, il doit y avoir une solution, mais pour t'aider, il faudrait nous en dire plus sur ce que tu cherches à faire...
Oui je vais éviter l'option de la balle :p
Si c'est possible, je veux attendre la réponse, et ne marche pas :/

Citation:
Envoyé par Willpower Voir le message
Attention de ne pas mélanger les différentes solutions qu'on t'as proposé, pour l'ajout du paramètre async:false je t'ai bien précisé de reprendre ton code initial.
Oui je n'allait pas mélanger tout. J'avais déjà le code que tu as posté mais sans succès :s
__________________
Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...
FotoXe33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 20h45   #15
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 808
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 808
Points : 35 793
Points : 35 793
Citation:
Oui je vais éviter l'option de la balle :p

Je sais pas pourquoi, mais je ne suis pas étonné !

Sinon, décris-nous un peu mieux ce que tu souhaites faire
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 21h23   #16
Membre du Club
 
Inscription : mai 2009
Messages : 234
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 234
Points : 53
Points : 53
Bon le principe :

Une fonction qui génére un identifiants unique à partir de certains éléments.

FONCTION GENERER{
    SI laClef N'EST PAS GENERER
        laClef = ENVOIE_REQUETTE_AJAX()
        retour = GENERER();
    SINON
        test = ENVOIE_REQUETTE_AJAX(laClef) // Pour tester si la clef est ok
        SI test===VRAI
            retour = laCLef;
        SINON
            retour = FAUX;
        FIN SI
    FIN SI
}
__________________
Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...
FotoXe33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 21h28   #17
Membre Expert
 
Avatar de Watilin
 
Homme Matilin Torre
Étudiant
Inscription : juin 2010
Messages : 679
Détails du profil
Informations personnelles :
Nom : Homme Matilin Torre
Âge : 23
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2010
Messages : 679
Points : 1 202
Points : 1 202
Honni sois-tu, Willpower, d'avoir suggéré de l'Ajax synchrone ! Il y a toujours moyen de faire autrement.

@FotoXe33, je pense que tu as un problème avec les objets en JavaScript. Pour être précis, je pense que tu confonds la déclaration de la classe (ou plutôt du constructeur), et l'instanciation de l'objet.

Par exemple, ceci est un constructeur :
Code :
1
2
3
4
var Bidule = function( poids, couleur ) {
	this.poids = poids;
	this.couleur = couleur;
}
Et ceci est une instanciation :
Code :
var monBidule = new Bidule('500kg', 'rose');
Actuellement, ta variable monObj reçoit la fonction anonyme que tu as écrite, autrement dit monObj est une fonction ! De plus, si tu exécutes cette fonction, la variable maVar ne sera visible de personne, et la variable sendAjaxRequest sera globale. Ce n'est sans doute pas ce que tu veux obtenir.

Si j'ai bien compris, tu veux lancer une requête Ajax au moment où tu construis ton objet. Ce que je vais dire va t'aider à comprendre les callbacks, je pense.

Une requête Ajax c'est un peu comme un expresso : tu appuies sur le bouton et, en attendant que le café soir servi, tu fais autre chose. Maintenant, suppose que tu as une cafetière hyper moderne capable de se déplacer et de t'apporter ton café. En plus de ça, elle est relativement intelligente et comprend les ordres que tu lui donnes.
Si tu appuies sur le bouton et que tu lui dis « apporte-moi mon café », elle va t'apporter ton café tout de suite alors qu'il n'est pas forcément prêt. C'est ce que fait ton script actuellement.
Par contre, si tu lui dis « apporte-moi mon café quand il sera prêt », elle va attendre que le café soit prêt avant de te l'apporter. C'est ce que font les fonctions de callback.
Code :
1
2
3
4
5
6
7
8
$.preparerCafe({
	type: 'expresso',
	force: 'bien serré',
	sucre: 'pas trop',
	success: function( cafePret ) {
		apporterCafe(cafePret);
	}
});
Comme je n'ai pas exactement compris ce que tu cherches à faire, je vais te laisser chercher une solution à la lumière de ce que je viens de t'apprendre.

Une dernière chose :
Pourquoi pas :
?
__________________
Disposition de clavier ergonomique française : Bépo
Watilin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 21h51   #18
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 872
Points : 1 381
Points : 1 381
Citation:
Envoyé par FotoXe33 Voir le message
Bon le principe :

Une fonction qui génére un identifiants unique à partir de certains éléments.

FONCTION GENERER{
SI laClef N'EST PAS GENERER
laClef = ENVOIE_REQUETTE_AJAX()
retour = GENERER();
SINON
test = ENVOIE_REQUETTE_AJAX(laClef) // Pour tester si la clef est ok
SI test===VRAI
retour = laCLef;
SINON
retour = FAUX;
FIN SI
FIN SI
}
je ne suis pas sûr d'avoir tout compris, mais sous forme de callback, je te proposerai une solution comme ceci :
Code :
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
var key;
function suite_execution(){
	...
}
function suite_execution_negative(){
	...
}
function tester(){
	$.ajax({
		...:__,
		...:__,
		succes:function(obj){
			if(obj===true)
				suite_execution();
			else
				suite_execution_negative();
		}
	});
}
function generer(){
	if(!key){
		 $.ajax({
			...:__,
			...:__,
			succes:function(obj){
				key = obj;
				tester();
			}
		 });
	}
	else{
		tester();
	}
}
generer();

Citation:
Envoyé par Watilin Voir le message
Honni sois-tu, Willpower, d'avoir suggéré de l'Ajax synchrone ! Il y a toujours moyen de faire autrement.
je sais, j'ai eu moi-même un peu honte.

mais bon, je lui offrais une solution simple où il n'avait qu'à rajouter un paramètre booléen.
Willpower est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 17h47   #19
Membre du Club
 
Inscription : mai 2009
Messages : 234
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 234
Points : 53
Points : 53
Citation:
Envoyé par Watilin Voir le message
@FotoXe33, je pense que tu as un problème avec les objets en JavaScript. Pour être précis, je pense que tu confonds la déclaration de la classe (ou plutôt du constructeur), et l'instanciation de l'objet.

Par exemple, ceci est un constructeur :
Code :
1
2
3
4
var Bidule = function( poids, couleur ) {
	this.poids = poids;
	this.couleur = couleur;
}
Et ceci est une instanciation :
Code :
var monBidule = new Bidule('500kg', 'rose');
J'ai eut pendant 2 ans des cours objets, tkt je fais très bien la différence C'est avec js que je suis un peut pommé...

Citation:
Envoyé par Watilin Voir le message
Actuellement, ta variable monObj reçoit la fonction anonyme que tu as écrite, autrement dit monObj est une fonction ! De plus, si tu exécutes cette fonction, la variable maVar ne sera visible de personne, et la variable sendAjaxRequest sera globale. Ce n'est sans doute pas ce que tu veux obtenir.
Mon objet EST instancié ! Tout de même ! Et si, je VEUX que maVar ne soit accessible qu'à l'intérieur de l'objet. Idem pour sendAjaxRequest...

Citation:
Envoyé par Watilin Voir le message
Si j'ai bien compris, tu veux lancer une requête Ajax au moment où tu construis ton objet.
Absolument pas :/ Je souhaite lancé ma requette quand j'appelle ma fonction sendAjaxRequest, lors de la génération de la clef...

Citation:
Envoyé par Watilin Voir le message
Ce que je vais dire va t'aider à comprendre les callbacks, je pense.

Une requête Ajax c'est un peu comme un expresso : tu appuies sur le bouton et, en attendant que le café soir servi, tu fais autre chose. Maintenant, suppose que tu as une cafetière hyper moderne capable de se déplacer et de t'apporter ton café. En plus de ça, elle est relativement intelligente et comprend les ordres que tu lui donnes.
Si tu appuies sur le bouton et que tu lui dis « apporte-moi mon café », elle va t'apporter ton café tout de suite alors qu'il n'est pas forcément prêt. C'est ce que fait ton script actuellement.
Par contre, si tu lui dis « apporte-moi mon café quand il sera prêt », elle va attendre que le café soit prêt avant de te l'apporter. C'est ce que font les fonctions de callback.
Code :
1
2
3
4
5
6
7
8
$.preparerCafe({
	type: 'expresso',
	force: 'bien serré',
	sucre: 'pas trop',
	success: function( cafePret ) {
		apporterCafe(cafePret);
	}
});
Comme je n'ai pas exactement compris ce que tu cherches à faire, je vais te laisser chercher une solution à la lumière de ce que je viens de t'apprendre.
Merci pour cette explication par contre, car le callback je voyais plus ou moins ce que c'était mais sans plus. L'idée d’appeler une fonction dedans le callback est loin d'être con, j'y avait pas du tout pensé (mais bon une fonction qui sert juste à mettre une valeur dans un attribut d'objet ça fait chier, 'fin bref...)

Citation:
Envoyé par Watilin Voir le message
Une dernière chose :
Pourquoi pas :
?
Euh bonne question xD C'est exactement la même valeur ? Et si cette page est appelé via ajax ça marche quand même avec location.href ?

Citation:
Envoyé par Willpower Voir le message
je ne suis pas sûr d'avoir tout compris, mais sous forme de callback, je te proposerai une solution comme ceci :
Code :
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
var key;
function suite_execution(){
	...
}
function suite_execution_negative(){
	...
}
function tester(){
	$.ajax({
		...:__,
		...:__,
		succes:function(obj){
			if(obj===true)
				suite_execution();
			else
				suite_execution_negative();
		}
	});
}
function generer(){
	if(!key){
		 $.ajax({
			...:__,
			...:__,
			succes:function(obj){
				key = obj;
				tester();
			}
		 });
	}
	else{
		tester();
	}
}
generer();
Hélas, cela ne convient pas du tout à ma situation :/ Je sais que sans mon code exacte c'est un peut dure de tout comprendre mais je ne peut pas trop en dire plus pour le moment (expérimental :p)


Après plusieurs test (dont la solution de Watilin) et n'ayant pas de résultats plus concluant je vais tenter de mieux me faire comprendre.

J'ai une classe maClass ayant pour contenu :
  • Un attribut maClef
  • Un attribut generer (booléen) pour tester si la clef a déjà été générée
  • Un attribut time car j'ai mit une expiration de la clef
  • Une methode testTime(nbSecAuMax) pour tester si la clef a été généré il y a moins nbSecAuMax
  • Une méthode sendAjaxRequest pour envoyer les requettes
  • Une méthode générer_clef() qui génére, test, puis retourne la clef
  • Une méthode definir_clef() qui prends un paramètre ou non. Si un paramètre est présent (la clef), on définit la valeur de l'attribut maClef par le paramètre reçut. Dans tous les cas (paramètre ou non), on a return (maClef!==null);

Je précise que SEUL générer_clef() doit être PUBLIC.

On instancie (var monObj = new maClass();) puis on génére comme cela : var laClefGénérée = monObj.générer_clef();Il faut donc que générer_clef() ait l'algo suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
var valeurRetournée = false;
 
if(maClef === null && "test du temps"){
    time = "le temps actuelle";
    sendAjaxRequest();
    if(definir_clef()===true){
        valeurRetournée = générer_clef(); // A savoir cette fonction
    }
}
else{
    sendAjaxRequest();
    valeurRetournée = (definir_clef()===true) ? vid : false;
}
 
return valeurRetournée;
Pour se la jouer à la AOE2, "de l'aide, merci" :p
__________________
Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...
FotoXe33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 18h55   #20
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 944
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 944
Points : 4 776
Points : 4 776
lu un peu en diagonal mais une deux réflexions me viennent

1ére réflexion :
pourquoi ne pas traiter coté serveur la validité de la clef?
si on envoi null alors après test on en génère une et on la retourne, dans le cas contraire j'informe que c'est OK.

2éme réflexion :
si tu es en asynchrone tu vas avoir intérêt à donner une adresse de retour à ta fonction, car retourner une valeur c'est bien dans le vide c'est moyen. Cela peut être l'appel à une méthode de ton objet qui va elle atteindre ta variable.
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h45.


 
 
 
 
Partenaires

Hébergement Web