callback et return ???

15 réponses
Avatar
unbewusst.sein
j'utilise web sql et je souhaite retourner la date, et ne vois pas
comment...
c'est un problème -- pour moi -- avec le callback...

le script :
function read_date_now(db){
var now;
db.transaction(
function(t){
now="inner function(t)";
t.executeSql("SELECT date('now') as now;", [],
function(t,r){
now=r.rows.item(0).now; // <= là j'ai la bonne valeur
return now;
},
function(t,e){alert('Error:'+e.message);}
);
alert(now); // <= là j'ai 'undefined'
return now;
}
);
return now;
}

je ne me souviens plus du tout du scope d'une variable dans ce cas...
faut il mettre "var now; " ou "now;" tout court ?

--
« Face au monde qui bouge, il vaut mieux penser le changement
que changer le pansement ! »
(Francis Blanche)

10 réponses

1 2
Avatar
Pascal Poncet
Le 08/07/2011 10:43, Une Bévue a écrit :
j'utilise web sql et je souhaite retourner la date, et ne vois pas
comment...



Désolé, je ne connais pas bien web sql...

je ne me souviens plus du tout du scope d'une variable dans ce cas...
faut il mettre "var now; " ou "now;" tout court ?



...mais si ça peut aider, voici un petit test de portée :

function higherDef() {
var test_1 = test_2 = test_3 = "high";
function lowerDef() {
var test_1 = "low";
test_2 = "low";
test_3 = test_1;
}
lowerDef();
console.log(
"test_1 is still " + test_1 + " level definedn" +
"test_2 is now " + test_2 + " level definedn" +
"test_3 is also " + test_3 + " level defined"
);
}
higherDef();


--
Cordialement,
Pascal
Avatar
Bol
le script :
function read_date_now(db){
var now;



var now = "trop tot";

db.transaction(
function(t){
now="inner function(t)";
t.executeSql("SELECT date('now') as now;", [],
function(t,r){
now=r.rows.item(0).now; // <= là j'ai la bonne valeur
return now;
},
function(t,e){alert('Error:'+e.message);}
);
alert(now); // <= là j'ai 'undefined'



tu devrais avoir "trop tot";

return now;
}
);
return now;
}

je ne me souviens plus du tout du scope d'une variable dans ce cas...
faut il mettre "var now; " ou "now;" tout court ?



AMHA c'est pas une question de scope mais plutot de timing,
s'il y a des callback pour transaction et executeSql c'est très
probablement qu'elles sont asynchrones

Pour voir dans l'autre sens, essaye :

function read_date_now(db){
var now;



var tutut = 'top depart';

db.transaction(
function(t){
now="inner function(t)";
t.executeSql("SELECT date('now') as now;", [],
function(t,r){
now=r.rows.item(0).now; // <= là j'ai la bonne valeur



alert( tutut ); // <= AMHA tu auras "trop tard"
// défini après l'appel de db.transaction

return now;
},
function(t,e){alert('Error:'+e.message);}
);



tutut = 'trop tard';

alert(now); // <= là j'ai 'undefined'
return now;
}
);
return now;
}



Isn't it ?

HTH
A+
Bol
Avatar
unbewusst.sein
Pascal Poncet wrote:


Désolé, je ne connais pas bien web sql...



Pas grave, le pb ne vient pas de là car ma ligne :
now=r.rows.item(0).now;
donne bien la valeur su select qui a précédé, par contre je n'arrive pas
à retourner cette valeur...

> je ne me souviens plus du tout du scope d'une variable dans ce cas...
> faut il mettre "var now; " ou "now;" tout court ?

...mais si ça peut aider, voici un petit test de portée :

function higherDef() {
var test_1 = test_2 = test_3 = "high";
function lowerDef() {
var test_1 = "low";
test_2 = "low";
test_3 = test_1;
}
lowerDef();
console.log(
"test_1 is still " + test_1 + " level definedn" +
"test_2 is now " + test_2 + " level definedn" +
"test_3 is also " + test_3 + " level defined"
);
}
higherDef();



Oui, c'est bien ce que je pensais, dans "lowerDef()" la variable
"test_1" est locale, donc n'affecte pas la valeur de "test_1" dans
"higherDef()" et donc à la console on a :
test 1 high
test 2 low
test 3 low

je m'attendais à ça, MAIS dans mon cas :
function read_date_now(db){
var now='truc';
db.transaction(
function(t){
now="inner function(t)";
t.executeSql("SELECT date('now') as now;", [],
function(t,r){
now=r.rows.item(0).now;
alert(row);
},
function(t,e){alert('Error:'+e.message);}
);
}
);
return now;
}

je m'attends à ce que la valeur retournée soit la valeur de
r.rows.item(0).now soit "2011-07-08"
MAIS ça me donne "truc", même pas "inner function(t)"...

d'ailleurs il y a quelque chose de bizarre
si je met un alert(now) après la ligne now=r.rows.item(0).now;
et que j'appelle ma fonction par :
alert(read_date_now(db));

je n'ai qu'UN alert, qui me donne "truc" si, par contre, j'zappelle ma
fonction par :
read_date_now(db);
l'alert(row) après la ligne now=r.rows.item(0).now; me donne la bonne
valeur...

tout se passe "comme si" je ne pouvais avoir qu'un alert()...

j'ai aussi essayé avec window.now=... donne que dalle...
--
« Face au monde qui bouge, il vaut mieux penser le changement
que changer le pansement ! »
(Francis Blanche)
Avatar
unbewusst.sein
Bol wrote:

> le script :
> function read_date_now(db){
> var now;

var now = "trop tot";

> db.transaction(
> function(t){
> now="inner function(t)";// ***
> t.executeSql("SELECT date('now') as now;", [],
> function(t,r){
> now=r.rows.item(0).now; // <= là j'ai la bonne valeur
> return now;
> },
> function(t,e){alert('Error:'+e.message);}
> );
> alert(now); // <= là j'ai 'undefined'

tu devrais avoir "trop tot";



NON, mais c'est intéressant, là j'ai "inner function(t)" (cf. ***)

> return now;
> }
> );
> return now;
> }
>
> je ne me souviens plus du tout du scope d'une variable dans ce cas...
> faut il mettre "var now; " ou "now;" tout court ?

AMHA c'est pas une question de scope mais plutot de timing,
s'il y a des callback pour transaction et executeSql c'est très
probablement qu'elles sont asynchrones



ben oui, ah d'accord, oui, je vois ce que tu veux dire, la fonction
read_date_now(db) peut retourner AVANT que le résultat de :
t.executeSql("SELECT date('now') as now;",...
soit obtenu, ah oui, ça j'y crois fort.
Bien sûr avant de poster ici j'ai farfouiller sur le net... pas un seul
exemple où il y ait une fonction retournant une valeur, les seuls
exemples trouvés modifient le html; ce qui asynchrone...


Pour voir dans l'autre sens, essaye :

> function read_date_now(db){
> var now;

var tutut = 'top depart';

> db.transaction(
> function(t){
> now="inner function(t)";
> t.executeSql("SELECT date('now') as now;", [],
> function(t,r){
> now=r.rows.item(0).now; // <= là j'ai la bonne valeur

alert( tutut ); // <= AMHA tu auras "trop tard"
// défini après l'appel de db.transaction

> return now;
> },
> function(t,e){alert('Error:'+e.message);}
> );

tutut = 'trop tard';

> alert(now); // <= là j'ai 'undefined'
> return now;
> }
> );
> return now;
> }

Isn't it ?



OUAIS, BRAVO, c'est bien ça...
ce n'est donc pas du tout une question de scope...
tu as vu juste.

ben là, ce que je peux faire, c'est une boucle while du genre :

while(now == 'undefined')
wait a moment please
end

alert(now)


--
« Face au monde qui bouge, il vaut mieux penser le changement
que changer le pansement ! »
(Francis Blanche)
Avatar
Bol
s'il y a des callback pour transaction et executeSql c'est très
probablement qu'elles sont asynchrones



OUAIS, BRAVO, c'est bien ça...
ce n'est donc pas du tout une question de scope...
tu as vu juste.

ben là, ce que je peux faire, c'est une boucle while du genre :

while(now == 'undefined')
wait a moment please
end



AMHA, il faut le faire avec un setTimeout
pour que ta fonction d'attente soit aussi désynchronisée

A+
Bol
Avatar
unbewusst.sein
Bol wrote:


AMHA, il faut le faire avec un setTimeout
pour que ta fonction d'attente soit aussi désynchronisée



Exact, c'est ce que je viens de faire (mal sans doute) :
function read_date_now(db){
var now;
db.transaction(
function(t){
t.executeSql("SELECT date('now') as now;", [],
function(t,r){
now=r.rows.item(0).now;
},
function(t,e){alert('Error:'+e.message);}
);
}
);
function update() {
while (typeof(now)=='undefined') {
// update ...
setTimeout("update", 100);
}
}
return now;
}

j'ai du mal me dépatouiller, car ça sort tout de suite par un
'undefined'...
là, je pense que read_date_now(db) retourne quand update() boucle sur
lui même...
--
« Face au monde qui bouge, il vaut mieux penser le changement
que changer le pansement ! »
(Francis Blanche)
Avatar
Pascal Poncet
Le 08/07/2011 13:29, Une Bévue a écrit :
Bien sûr avant de poster ici j'ai farfouiller sur le net... pas un seul
exemple où il y ait une fonction retournant une valeur, les seuls
exemples trouvés modifient le html; ce qui asynchrone...



Peut-être que ce lien pourra te donner un bon tuyau, car il semble que
le même genre de problème ait été rencontré :

[http://stackoverflow.com/questions/4052479/html5-database-api-synchronous-request]


--
Cordialement,
Pascal
Avatar
unbewusst.sein
Pascal Poncet wrote:


Peut-être que ce lien pourra te donner un bon tuyau, car il semble que le
même genre de problème ait été rencontré :

[http://stackoverflow.com/questions/4052479/html5-database-api-synchronous
-request]



Impec, merci beaucoup, ce que ça donne, grosso modo :

function myCallback(now) {
alert(now);
}

puis qqpart (sans importance :
read_date_now(db, myCallback);

et enfin :
function read_date_now(db, myCallback){
db.transaction(
function(t){
t.executeSql("SELECT date('now') as now;", [],
function(t,r){
myCallback(r.rows.item(0).now);
},
function(t,e){alert('Error:'+e.message);}
);
}
);
}

il suffisait d'y penser )))

j'ai mis ton lien en ref dans mon code...

thanks a lot !!!
--
« Face au monde qui bouge, il vaut mieux penser le changement
que changer le pansement ! »
(Francis Blanche)
Avatar
Stéphane Santon
Bonjour,

Qu'est-ce que Web SQL ? Un lien ?
Relation avec JavaScript ?

Merci

Une Bévue a écrit :
j'utilise web sql et je souhaite retourner la date, et ne vois pas
comment...
c'est un problème -- pour moi -- avec le callback...



--
Stéphane

Jeune Chambre Economique de Saintes *** http://www.jce-saintes.org
Agitateurs d'idées... accélérateurs de talents !

BTS Electrotechnique *** http://enselec.santonum.eu
Avatar
unbewusst.sein
Stéphane Santon wrote:

Qu'est-ce que Web SQL ? Un lien ?


<http://experimenting.in/other/demo_websql.htm>
un bon exemple

Relation avec JavaScript ?



ben dans le butineur il y a une implémentation d'une interface SQLite
vers javascript.

ç roule très bien, attention c'est du client)side.
--
« Face au monde qui bouge, il vaut mieux penser le changement
que changer le pansement ! »
(Francis Blanche)
1 2