0 votes

Comment définir le statut avec l'api HTML5 Web Database

J'utilise l'API de base de données Web HTML5 et j'ai une fonction qui vérifie si l'application doit effectuer sa phase de configuration :

this.setupRequired = function() {
    var status;
    try {
        this.db.transaction(function(tx) {
            tx.executeSql("SELECT * FROM settings", [], function (tx,result) {
                if (result.rows.length == 0) {
                    status =  true;
                } else {
                  status = false;
                }
            }, function(tx) {
                status = true;
            })
        });
    } catch (e) {
        return true;
    }
    return status
}

J'aimerais renvoyer true ou false selon qu'il y a ou non des données dans le tableau des paramètres (ou si le tableau des paramètres n'existe pas). La variable status n'est pas définie, je suppose que cela est dû à des problèmes de portée et aux fonctions de rappel anonymes. Je suis presque sûr que je dois utiliser une fermeture ici pour corriger le problème mais je n'arrive pas à le faire correctement.

0voto

Stijn de Witt Points 101

Hmm, je n'ai pas d'expérience dans l'utilisation de cette API mais il semble que vous essayez de définir une valeur dans une fonction de rappel et de renvoyer ensuite cette valeur depuis la fonction externe. En supposant que le callback soit asynchrone, cela ne fonctionnera pas. Je pense que votre meilleure chance est de changer votre code en quelque chose comme :

this.setupRequired = function() {
    try {
        this.db.transaction(function(tx) {
            tx.executeSql("SELECT * FROM settings", [], function (tx,result) {
                if (result.rows.length == 0) {
                    doYourSetupFunction();
                } else {
                  //don't;
                }
            }, function(tx) {
                doYourSetupFunction();
            })
        });
    } catch (e) {
        doYourSetupFunction();
    }
}

Ainsi, la fonction setupRequired est responsable de la vérification et du déclenchement du setup.

0voto

matpol Points 2602

Vous pourriez probablement définir le statut comme une propriété de l'objet ou d'un autre objet de votre choix.

Vous pouvez également vérifier à chaque étape ce qu'est "this" ou quelle valeur a le statut en utilisant firebug.

0voto

bobince Points 270740

J'aimerais renvoyer un message vrai ou faux selon qu'il y a ou non des données dans le tableau des paramètres.

Tu ne peux pas. On ne sait pas s'il y a des données dans la table de paramétrage au moment où la setupRequired() doit retourner. Cela ne sera connu que lorsque la base de données SQL aura effectué la requête et invoqué la fonction de rappel. Cela ne se produit qu'après setupRequired() et les fonctions qui ont conduit à son appel sont toutes sorties, rendant le contrôle au navigateur.

C'est tout l'intérêt de la fonction de rappel qui est transmise à executeSql() . La fonction n'est pas exécutée tout de suite, donc status n'aura pas été touché au moment où return status est atteint. De plus, les exceptions qui se produisent à l'intérieur des fonctions de rappel n'entraîneront pas l'échec de l'opération. catch(e) à exécuter, car le bloc try...catch aura été quitté depuis longtemps au moment où la fonction qui a été définie à l'intérieur de ce bloc sera effectivement appelée. Ainsi, cette try...catch est effectivement inutile.

Il s'agit d'un codage "asynchrone". Ce n'est pas parce qu'une partie du code se trouve sous une fonction que la fonction va s'exécuter en premier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X