IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Portée d'une variable


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Par défaut
    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

  3. #3
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut
    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 ?

  4. #4
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 );
     
    });

  5. #5
    Membre habitué
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quelle est la portée d'une variable dans une page ASP ?
    Par sauceaupistou dans le forum ASP
    Réponses: 3
    Dernier message: 19/03/2007, 18h16
  2. Porté d'une variable
    Par koolkris dans le forum Delphi
    Réponses: 3
    Dernier message: 08/03/2007, 20h29
  3. Portée d'une variable dans une boucle FOR ?
    Par Neo41 dans le forum C++
    Réponses: 20
    Dernier message: 17/11/2006, 11h14
  4. [XSLT] pb portée d'une variable
    Par NPortmann dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 23/05/2006, 15h53
  5. Portée d'une variable globale
    Par Giill dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 27/12/2005, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo