Considérez:
var globalvar; function viewyearmain() { db.transaction(function (tx) { tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results) { var len = results.rows.length; msg = len; globalvar = msg; }, null); }); if (globalvar>0) { alert("ROWS FOUND"); } else { alert("ROWS NOT FOUND"); } }
6 Réponses :
Un rappel asynchrone n'est pas synchrone, quel que soit le montant que vous voulez que ce soit.
Déplacez simplement tout em> le code qui dépend du résultat dans le rappel: P> var globalvar;
function viewyearmain() {
db.transaction(function (tx)
{
tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results)
{
var len = results.rows.length;
msg = len;
globalvar = msg;
if (globalvar>0)
{
alert("ROWS FOUND");
}
else
{
alert("ROWS NOT FOUND");
}
}, null);
});
}
À ma connaissance, WebSQL ne prend pas en charge les relevés SQL synchrones. Ceci est normalement une bonne chose, car vous ne voulez pas que le traitement de SQL perturbe ou gelez votre interface utilisateur. En tant que tel, la réponse de CL. Fournit le bon mécanisme asynchrone pour le traitement des résultats à une requête. P>
Si, toutefois, vous désirez vraiment des requêtes SQL synchrones, puis consultez l'alternative WebSQL: SEQUELSPHERE - une base de données relationnelle SQL HTML5 / JavaScript . P>
Il est 100% JavaScript, il fonctionne donc dans n'importe quel navigateur et sur n'importe quelle plate-forme. De plus, il stocke ses données dans indexeddb ou localStorage. Il contient également de nombreuses cloches et sifflets que WebSQL ne fait pas: intégration JSON, traqueurs de changements, fonctions SQL définies par l'utilisateur, traitement SQL synchrone, etc. puisque la norme WebSQL a été obsolète, je pense que c'est une excellente alternative. P>
Divulgation complète: j'adore WebSQL, mais je suis marié à SuiteSphere. P>
Merci pour l'information ... J'ai déjà réparé mon code selon l'idée de CL et son travail. Mais je vais passer par le poteau aussi .. Merci @John Fowler ..
@John Fowler Je veux savoir que Sequelsphere est le support hors ligne ou non?
@KANNA SEQUELSHERE prend en charge hors ligne (à l'aide d'un fichier manifeste de cache d'applications). Il stocke ses données dans IndexeddB ou localStorage (dans cet ordre, en fonction de ce que le navigateur prend en charge).
@Johnfowler: On dirait que le lien que vous avez mentionné est mort!?
C'est un peu tard maintenant, mais pour ce que ça vaut la peine ... Vous ne pouvez pas faire les appels synchrones, mais vous pouvez simplifier votre code en utilisant une bibliothèque telle que async . Cela peut sembler trop chers, mais si vous avez besoin d'effectuer 3 ou 4 déclarations d'affilée, vous pouvez rendre votre code beaucoup plus facile à lire.
async.waterfall([ function(callback){ db.transaction(function (tx) { tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results) { var len = results.rows.length; callback(null, len) }, function(){ callback("An error occurred when reading data"); } }); }); }, function(len, callback){ // Now do something with the length. console.log("The length is: " + len); } ]);
Je suis quelques années de retard, mais je pensais que la question n'a jamais été directement répondue, je pensais que je jetais mes deux cents, comme le cul ajoute quelques suggestions!
Premièrement, si vous lisez Ceci, vous ne devriez probablement pas utiliser WebQL. Il a été déprécée en faveur de indexeddB, qui, à ce stade, est la seule base de données sur la piste de normes W3C . P>
Si, pour une raison quelconque, vous êtes intention d'utiliser WebSQL et que vous pouvez vivre sans les avantages que son API asynchrone offre (dont certaines sont mentionnées dans la réponse de John Fowler), alors vous devriez savoir que sa spécification définit également un API synchrone . p>
Alors oui, il existe un moyen d'exécuter des instructions dans WebSQL synchroneusement, à condition que les navigateurs que vous développez pour avoir mis en place l'API synchrone. P>
Si cela ne vous dérange pas de traiter avec un Interface asynchrone qui est à peu près aussi simple qu'un synchrone, consultez Bakedboods . P>
avec elle, l'exécution de votre requête est aussi simple que: p>
bakedGoods.getAll({ filter: "valueObj.holdingType === 'month'", storageTypes: ["webSQL"], //Contains database configuration data and operation preferences options: optionsObj, complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){} });
pas tout à fait synchrone - mais c'est un départ.
Créer une fonction d'assistant pour exécuter vos requêtes de la promesse p> puis lors de la fonction ASYNC, Vous pouvez utiliser le mot-clé 'attendre' p> Toutefois, vous pouvez avoir des problèmes à la suite de la transaction, car l'objet peut de référencer une fois que la promesse remplit. P>
De nos jours, vous pouvez profiter de async / attendre code> et des promesses comme ceci: