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 21/02/2011, 22h51   #1
Invité de passage
 
Inscription : février 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 12
Points : 2
Points : 2
Par défaut Portée d'une variable

Bonjour à tous,

Je suis nouveau sur ce forum, bien que je le consulte régulièrement (regorgeant d'informations très utiles). Aujourd'hui, j'ai grand besoin de votre aide car je bute sur un problème qui me parait simple mais dont je n'arrive pas à trouver la solution :

Voici le code ( simplifié ) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
 
db.transaction( function( transaction ) {
 
    var n = 0;
 
    var dataHandler = function( transaction, result ) {
        for( var i = 0; i < result.rows.length; i++ ) {
            n++; // n est bien incrémenté
        }
    };
 
    transaction.executeSql( "select ...", [], dataHandler, errorHandler );
 
    alert( n ); // affiche 0
 
});
Dans le code ci-dessus, je déclare tout d'abord une variable "n" que je souhaite incrémenter pour chaque résultat d'une requête SQLite. Etant déclarée à l'extérieur de dataHandler(), cette fonction y a donc accès, l'incrémentation se fait bien en mode debug mais à la sortie de la fonction, n = 0.

Si quelqu'un saurait me dire où est mon erreur. Merci (testé sous Safari / Chrome)


[edit]

Bon, j'ai un peu avancé: en ajoutant un alert() à la fin du dataHandler :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 
db.transaction( function( transaction ) {
 
    var n = 0;
 
    var dataHandler = function( transaction, result ) {
        for( var i = 0; i < result.rows.length; i++ ) {
            n++; // n est bien incrémenté
        }
        alert( n ); // affiche 5
    };
 
    transaction.executeSql( "select ...", [], dataHandler, errorHandler );
 
    alert( n ); // affiche 0
 
});
Dans l'ordre, j'ai un alert( 0 ) suivi d'un alert( 5 ) ce qui me laisse penser que la fonction dataHandler est exécutée à la fin de la transaction, ce qui finalement semble logique.
wacky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 01h10   #2
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
je pense que t'as fonction transaction.executeSql, exécute une fonction AJAX qui est asynchrone, comme un thread...

y'a deux façon de contourner le problème, soit tu passes une fonction de callback à t'a méthode ajax, qui s’exécutera à la fin de la requête, soit tu fais une requête en mode synchrone
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 01h29   #3
Invité de passage
 
Inscription : février 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 12
Points : 2
Points : 2
Merci pour ta réponse kimjoa,

Les requêtes SQLite (avec la fonction executeSql) doivent effectivement fonctionner de la même manière que les requêtes AJAX (asynchrone) : Lorsque le résultat est obtenu, alors le handler est appelé.

Ce qui m'amène au véritable problème que me pose cette fonction:
Ce que je cherche à faire, c'est:

- Exécuter une requête
- Evaluer le nombre de résultats obtenus
- Si ce nombre de résultat n'est pas suffisant
- Alors Exécuter la même requête avec des contraintes plus larges
etc

Tout ceci de manière récursive et asynchrone.


Je m'embrouille un peu dans la récursivité
Comment pourrais-je procéder ?
wacky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 02h09   #4
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 847
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 847
Points : 1 344
Points : 1 344
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
 
db.transaction( function( transaction ) {
 
    var n = 0;
 
    var dataHandler = function( transaction, result ) {
        for( var i = 0; i < result.rows.length; i++ ) {
            n++; // n est bien incrémenté
        }
 
// appel(s) recursif(s)
       if(n<10)
          transaction.executeSql( "select .... more", [], dataHandler, errorHandler );
 
    };
//premier appel
    transaction.executeSql( "select ...", [], dataHandler, errorHandler );
 
});
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 02h48   #5
Invité de passage
 
Inscription : février 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 12
Points : 2
Points : 2
Willpower, merci pour le coup de main,
Je ferai un essai demain bien que je soit septique car au moment où l'on appelle transaction.executeSql() par récursivité,
transaction (fourni par db.transaction) n'existe plus il me semble. (?)
Merci en tout cas !

[edit]
Ce que je veux dire par là c'est qu'il paraitrait logique que la transaction à la BDD soit close et qu'il faille ouvrir une nouvelle transaction (db.transaction).
Je ferai des tests demain
wacky 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 11h06.


 
 
 
 
Partenaires

Hébergement Web