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 03/02/2012, 17h33   #1
Invité de passage
 
Inscription : février 2012
Messages : 18
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 18
Points : 4
Points : 4
Par défaut Passage et recupération de paramètre Closure

Bonjour,

J'ai un problème concernant deux fonctions dont une imbriqué, le résultat retourner est undefined et la valeur que je désire récuperer et stocké dans "Closure" avec le debugger de chrome.

J'aimerais savoir comment accéder à cette valeur :
Voici en "gros de chez gros mon code".

fonction 1
Code :
1
2
3
function modifier(){
return(getres(id));
}
fonction 2
Code :
1
2
3
4
5
6
function getres(id){
this.id=id;
db.transaction(function(tx){
tx.executeSql("...",[],function (tx,resu) { return value; }, function (tx,error) { return 0; });
});
}
J'ai donc ma value dans "closure" et l'appel de la fonction modifier() me retourne undefined.

Merci d'avance.
anoninc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 18h37   #2
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 954
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 954
Points : 4 790
Points : 4 790
Bonjour,
pas tout bien compris MAIS ta fonction ne peut pas retourner autre chose que undefined attendu qu'elle ne reçoit pas de paramètre lui permettant d'identifier id.

Le code que tu nous montres est à mon sens insuffisant pour cerner ton problème.
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 18h48   #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 778
Points : 35 778
Je rajouterais qu'en plus, vu que ta fonction getres ne retourne rien,
renverra toujours undefined :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
function globale(fn){
    alert(fn());
}
function fn1(){
    var txt = 'Hello world !';
}
function fn2(){
    var txt = 'Hello world !';
    return txt;
}
globale(fn1);
globale(fn2);
__________________
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 03/02/2012, 19h14   #4
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 877
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 877
Points : 1 388
Points : 1 388
Citation:
Envoyé par NoSmoking Voir le message
Bonjour,
pas tout bien compris MAIS ta fonction ne peut pas retourner autre chose que undefined attendu qu'elle ne reçoit pas de paramètre lui permettant d'identifier id.

Le code que tu nous montres est à mon sens insuffisant pour cerner ton problème.
"id" pourrait très bien être global, par contre comme le dit bovino, "modifier" est censé retourner le résultat de "getres" mais "getres" ne retourne rien. (il n'y a pas de mot clé "return" dans la fonction ormis celui appartenant à une autre fonction imbriquée.)

n'ayant pas assez d'éléments pour proposer une réponse, je tente au pif-o-mètre :

Code :
1
2
3
4
function getres(id){
this.id=id;
return db.transaction(function(tx){tx.executeSql("...",[],function (tx,resu) { return value; }, function (tx,error) { return 0; });});
}
ou alors :

Code :
1
2
3
4
function getres(id){
this.id=id;
db.transaction(function(tx){tx.executeSql("...",[],function (tx,resu) { return value; }, function (tx,error) { return 0; });});
return this;}
ou encore :

Code :
1
2
3
function modifier(){
return new getres(id);
}
Willpower est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 19h48   #5
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 954
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 954
Points : 4 790
Points : 4 790
Citation:
Envoyé par Willpower
"id" pourrait très bien être global, par contre comme le dit bovino, "modifier" est censé retourner le résultat de "getres" mais "getres" ne retourne rien. (il n'y a pas de mot clé "return" dans la fonction ormis celui appartenant à une autre fonction imbriquée.)
tu as tout à fait raison, je me suis simplement pris à penser que quelqu'un qui instancie un objet ne ferait pas l'erreur de passer en paramètre une variable globale à une fonction alors qu'il ne le fait pas sur la fonction qui la contient.

Je dois reconnaître que Bovino à mis le doigt sur le pourquoi le plus légitime.

Reflexion: Mais combien a-t-il de doigts?
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 11h22   #6
Invité de passage
 
Inscription : février 2012
Messages : 18
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 18
Points : 4
Points : 4
Bonjour,

Merci pour vos réponses.

Débutant je n'ai pas très bien compris ta réponse Bovino.

Willpower j'avais pensé à faire cela mais ce qui m'amène ici est le "déroulement" de ma fonction.

Je vais donc vous expliquer en détail:

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
        function modifier(){
            var idselect = ; // je recupere l'id d'un select
			console.log(idselect); // me retourne l'entier id
            db.transaction(function(tx) {
                    tx.executeSql("ma requete WHERE id=?", [idselect],
                    function(tx,resu){
						// je rentre ici et donc ma requête s'execute convenablement
                        console.log(getres(idselect)); // la j'obtient undefined
                        },
                    function(tx,error)
                        {
                            return;
                        });
                });
        }
 
 
		        function getres(id){
                this.id=id;
				console.log(id); // me retourne l'entier id passé en paramètre et affecter à la fonction
                db.transaction(function(tx) {
                    tx.executeSql("ma requete WHERE id=?", [id],
                    function(tx,resu){
                        // je construit un array à partir d'un SELECT
                        table = array2json(table); // je json l'array
                        console.log(table); // me retourne l'array en json
                        return table;
                    },
                    function(tx,error)
                        {
                            document.write("Impossible d'inserer ces donnees: "+error.message);
                        });
                });
                }
Le problème est que les breakpoint afficher à tous mes logs, me montrent que l'appel de la fonction getres dans modifier me retourne undefined mais qu'ensuite je passe bien dans getres et le return est celui que j'attend.

Les fonctions fonctionnent, le return de getres aussi, l'appel aussi.
Je ne sais pas si je n'arrive pas à atteindre le return qui est fortement imbriqué via un getres(id) tout simple, si c'est une histoire de timeOut ou autre.

Merci d'avance.
anoninc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 11h27   #7
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 877
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 877
Points : 1 388
Points : 1 388
Citation:
Envoyé par anoninc Voir le message
Bonjour,

Merci pour vos réponses.

Débutant je n'ai pas très bien compris ta réponse Bovino.

Willpower j'avais pensé à faire cela mais ce qui m'amène ici est le "déroulement" de ma fonction.

Je vais donc vous expliquer en détail:

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
        function modifier(){
            var idselect = ; // je recupere l'id d'un select
			console.log(idselect); // me retourne l'entier id
            db.transaction(function(tx) {
                    tx.executeSql("ma requete WHERE id=?", [idselect],
                    function(tx,resu){
						// je rentre ici et donc ma requête s'execute convenablement
                        console.log(getres(idselect)); // la j'obtient undefined
                        },
                    function(tx,error)
                        {
                            return;
                        });
                });
        }
 
 
		        function getres(id){
                this.id=id;
				console.log(id); // me retourne l'entier id passé en paramètre et affecter à la fonction
                db.transaction(function(tx) {
                    tx.executeSql("ma requete WHERE id=?", [id],
                    function(tx,resu){
                        // je construit un array à partir d'un SELECT
                        table = array2json(table); // je json l'array
                        console.log(table); // me retourne l'array en json
                        return table;
                    },
                    function(tx,error)
                        {
                            document.write("Impossible d'inserer ces donnees: "+error.message);
                        });
                });
                }
Le problème est que les breakpoint afficher à tous mes logs, me montrent que l'appel de la fonction getres dans modifier me retourne undefined mais qu'ensuite je passe bien dans getres et le return est celui que j'attend.

Les fonctions fonctionnent, le return de getres aussi, l'appel aussi.
Je ne sais pas si je n'arrive pas à atteindre le return qui est fortement imbriqué via un getres(id) tout simple, si c'est une histoire de timeOut ou autre.

Merci d'avance.

Ta fonction "getres" ne renvoit toujours rien ....


voila en résumé la fonction getres que tu nous donnes (sans le parametre de transaction qui est une longue fonction) :

Code :
1
2
3
4
5
function getres(id){
	this.id=id;
	console.log(id); // me retourne l'entier id passé en paramètre et affecter à la fonction
	db.transaction(param_sous_form_de_fonction);
}
Willpower est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 11h28   #8
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 778
Points : 35 778
Citation:
Débutant je n'ai pas très bien compris ta réponse Bovino.
J'avais benoitement pensé que l'exemple donné était assez éloquent...
__________________
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 04/02/2012, 11h29   #9
Invité de passage
 
Inscription : février 2012
Messages : 18
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 18
Points : 4
Points : 4
Citation:
Envoyé par Willpower Voir le message
Ta fonction "getres" ne renvoit toujours rien ....
Mais peut tu m'expliquer pourquoi ? étant donné que le log me dis qu'en return j'ai bien table remplis suivant l'id passé en paramètre ..

Il faudrait que j'appel par getres puis transaction puis resu c'est ca ? ?
anoninc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 11h32   #10
Invité de passage
 
Inscription : février 2012
Messages : 18
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 18
Points : 4
Points : 4
Citation:
Envoyé par Bovino Voir le message
J'avais benoitement pensé que l'exemple donné était assez éloquent...
Merci tout de même pour ta réponse mais je suis ultra débutant avec le JS.
Biensur si tu as du temps pour m’expliquer en détail je ne serais que preneur.
anoninc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 11h35   #11
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 877
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 877
Points : 1 388
Points : 1 388
Citation:
Envoyé par anoninc Voir le message
Mais peut tu m'expliquer pourquoi ? étant donné que le log me dis qu'en return j'ai bien table remplis suivant l'id passé en paramètre ..

Il faudrait que j'appel par getres puis transaction puis resu c'est ca ? ?
J'ai édité ma réponse précédente, il n'y a tout simplement pas de return dans ton getres. (il y en a seulement dans les fonctions qu'il appelle ou passe en paramètre)

quelle est la variable que tu souhaites retourner ? "table" ?

sais-tu ce que retournes les fonctions "db.transaction" et "tx.executeSql" ?
Willpower est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 11h40   #12
Invité de passage
 
Inscription : février 2012
Messages : 18
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 18
Points : 4
Points : 4
Citation:
Envoyé par Willpower Voir le message
J'ai édité ma réponse précédente, il n'y a tout simplement pas de return dans ton getres. (il y en a seulement dans les fonctions qu'il appelle ou passe en paramètre)

quelle est la variable que tu souhaites retourner ? "table" ?

sais-tu ce que retournes les fonctions "db.transaction" et "tx.executeSql" ?
J'ai vu ta réponse que je n'avoue pas avoir entièrement saisie.
La variable que je souhaite retourner est table si je suis passé dans la fonction tx-resu, sinon rien si je suis passé dans tx-error.

Non je ne sais pas ce que retourne ces fonctions, probablement un booleen pour tx.executeSql sans certitude. à vrai dire je ne peux disposer du code qu'après ce we.
anoninc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 11h53   #13
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 877
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 877
Points : 1 388
Points : 1 388
Citation:
Envoyé par anoninc Voir le message
J'ai vu ta réponse que je n'avoue pas avoir entièrement saisie.
La variable que je souhaite retourner est table si je suis passé dans la fonction tx-resu, sinon rien si je suis passé dans tx-error.

Non je ne sais pas ce que retourne ces fonctions, probablement un booleen pour tx.executeSql sans certitude. à vrai dire je ne peux disposer du code qu'après ce we.
Essaye dans un premier temps de séparer tes fonctions en les nommant, tu y verras plus clair(une fois toute l’exécution bien assimilée, tu les ré-incluera dans tes closures anonymes) :



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
36
37
38
39
40
function modifier(){
	function sqlSucces(tx,resu){
		// je rentre ici et donc ma requête s'execute convenablement
		console.log(getres(idselect)); // la j'obtient undefined
		// NE RETOURNE RIEN ?
	}
	function sqlError(tx,error){
		return;
	}
	function do_transation(tx) {
		tx.executeSql("ma requete WHERE id=?", [idselect],sqlSucces,sqlError); // QUE RETOURNE tx.executeSql ?
		// NE RETOURNE RIEN ?
	}
 
	var idselect = ; // je recupere l'id d'un select
	console.log(idselect); // me retourne l'entier id
	db.transaction(do_transation); // QUE RETOURNE db.transaction ?
	// NE RETOURNE RIEN ?
}
 
function getres(id){
	function sqlSucces(tx,resu){
		// je construit un array à partir d'un SELECT
		table = array2json(table); // je json l'array
		console.log(table); // me retourne l'array en json
		return table;
	}
	function sqlError(tx,error){
		document.write("Impossible d'inserer ces donnees: "+error.message);
		// NE RETOURNE RIEN ?
	}
	function do_transaction(tx) {
		tx.executeSql("ma requete WHERE id=?", [id],sqlSucces,sqlError); // QUE RETOURNE tx.executeSql ?
		// NE RETOURNE RIEN ?
	}
	this.id=id;
	console.log(id); // me retourne l'entier id passé en paramètre et affecter à la fonction
	db.transaction(do_transaction); // QUE RETOURNE db.transaction ?
	// NE RETOURNE RIEN ?
}
Willpower est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 11h58   #14
Invité de passage
 
Inscription : février 2012
Messages : 18
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 18
Points : 4
Points : 4
D'accord et bien merci.

Je te ferais part de mon retour ce we si possible ou lundi.

Je m'attendais à quelque chose de très simple pour atteindre table.
J'ai encore du mal à comprendre pourquoi modifier me retourne rien avant de passer dans getres et qu'ensuite getres me retourne ce que je veux (mais a priori trop tard).
anoninc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 11h42   #15
Invité de passage
 
Inscription : février 2012
Messages : 18
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 18
Points : 4
Points : 4
Bonjour,

Voila j'ai trouvé un post similaire à mon problème :
http://stackoverflow.com/questions/6...158821#9158821

En faites avec des breaks point j'ai pu voir que ma fonction modifier() s'execute, va dans getres lors de l'appel mais que getres n'execute pas directement la fonction db.transaction mais seulement à la fin de modifier().
Comment avoir le return ... telle est la question. :/

Merci d'avance.
anoninc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 12h33   #16
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 877
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 877
Points : 1 388
Points : 1 388
Par défaut ajax asynchrone

c'est un problème récurrent, ton code produit probablement un appel ajax asynchrone.

c'est à dire, qu'il fait un appel externe et continue à exécuter ton code sans attendre la réponse.

pour gérer la réponse, tu dois te servir de ton callback(dans le cas présent, c'est probablement les fonctions que tu passes en paramètre).

explications :

un code traditionnel, séquentiel, ou synchrone exécute les instructions les unes après les autres :

Code :
1
2
3
4
5
6
function(){
    instruction1;
    requete_synchrone;
// nous passons à la ligne suivant une fois que la requete synchone à recu sa réponse
    instruction2;
}
un code avec des requêtes Asynchrones, fonctionne comme suit :

Code :
1
2
3
4
5
6
function(){
    instruction1;
    requete_asynchrone;
// nous passons directement à la ligne suivant sans attendre la réponse de la requete asynchone 
    instruction2;
}
le résultat de la requête peut être récupéré grace à une fonction de callback déclenché par l'événement de réception de la réponse (onSucces, onreadystate, ...)

il faut donc penser le code autrement si l'on veut que la suite des instructions accèdent à notre résultat, comme ceci :

Code :
1
2
3
4
5
6
7
8
9
10
function(){
    instruction1;
    requete_asynchrone(
        function callback(resultat){
            // la fonction passée en paramètre à notre requete traitera la réponse une fois celle-ci obtenue 
            instruction2;
        }
    );
// la suite des instructions à été déplacé dans la fonction de callback pour leurs donner accès à la réponse de la requête.
}

à première vue l'appel asynchrone peut te paraitre un peu plus compliqué que le synchrone, mais en réalité une fois que tu as compris le principe, c'est du pareil au même, il suffit de placer tes instructions au bon endroit.

aussi, l'appel syncrhone (le premier exemple qui semble plus simple) est souvent déconseillé car il est bloquant... ton code est en pause jusqu'a obtention de la réponse alors que tu pourrais concevoir de continuer à vouloir animer ta page en javascript(ou effectuer diverses actions) en attendant une réponse du serveur.


edit: Ainsi, ton return doit être géré autrement, tu dois selon le traitement que tu comptais faire du return, exécuter ce traitement non pas sur le return mais dans la fonction de callback directement.

edit2: exemple, au lieu de faire :

Code :
1
2
3
4
5
function modifier(){
    db.transaction();
    return null;
}
traitement(modifier());
tu devrais faire :

Code :
1
2
3
4
function modifier(){
    db.transaction(traitement);
}
modifier();
Willpower est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/02/2012, 20h29   #17
Invité de passage
 
Inscription : février 2012
Messages : 18
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 18
Points : 4
Points : 4
J'ai quasi fait ce que tu proposais dans ton dernier message.

Je te remercie donc pour ton aide et ta patience.
anoninc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h22.


 
 
 
 
Partenaires

Hébergement Web