callback et return ???
Le
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)
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)
Désolé, je ne connais pas bien web sql...
...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
var now = "trop tot";
tu devrais avoir "trop tot";
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 :
var tutut = 'top depart';
alert( tutut ); // <= AMHA tu auras "trop tard"
// défini après l'appel de db.transaction
tutut = 'trop tard';
Isn't it ?
HTH
A+
Bol
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...
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)
NON, mais c'est intéressant, là j'ai "inner function(t)" (cf. ***)
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...
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)
AMHA, il faut le faire avec un setTimeout
pour que ta fonction d'attente soit aussi désynchronisée
A+
Bol
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)
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
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)
Qu'est-ce que Web SQL ? Un lien ?
Relation avec JavaScript ?
Merci
Une Bévue a écrit :
--
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
un bon exemple
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)