2013-02-10 5 views
6

Bedenken Sie:Wie wird eine WebSQL-Abfrage synchron gemacht?

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"); 
    } 
} 

Das Problem ist, dass ROWS NOT FOUND erscheint, da die Transaktion durch die Zeit nicht abgeschlossen ist die if Anweisung erreicht ist.

Antwort

5

Ein asynchroner Rückruf ist nicht synchron, unabhängig davon, wie viel Sie möchten.

Bewegen Sie einfach alle der Code der auf das Ergebnis in den Rückruf ab:

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); 

    }); 
} 

Alternativ ist es in eine zweite Funktion setzen und rufen das vom Rückruf.

+0

@Michael Um eine Frage zu stellen, benutzen Sie die Schaltfläche "Frage stellen". –

0

Meines Wissens unterstützt WebSQL keine synchronen SQL-Anweisungen. Dies ist normalerweise eine gute Sache, da Sie nicht möchten, dass die Verarbeitung von SQL Ihre Benutzeroberfläche unterbricht oder einfriert. Daher bietet die Antwort von CL. Den richtigen asynchronen Mechanismus für die Verarbeitung von Ergebnissen zu einer Abfrage.

Wenn Sie jedoch wirklich synchrone SQL-Abfragen wünschen, dann lesen Sie die WebSQL-Alternative: SequelSphere - An HTML5/JavaScript SQL Relational Database.

Es ist 100% JavaScript, also läuft es in jedem Browser und auf jeder Plattform. Außerdem speichert es seine Daten entweder in IndexedDB oder LocalStorage. Es enthält auch viele Schnickschnack, die WebSQL nicht hat: JSON-Integration, Change Tracker, benutzerdefinierte SQL-Funktionen, SYNCHRONOUS SQL-Verarbeitung usw. Da der WebSQL-Standard veraltet ist, halte ich dies für eine ausgezeichnete Alternative.

Vollständige Offenlegung: Ich liebe WebSQL, bin aber mit SequelSphere verheiratet.

+0

Vielen Dank für die Informationen ... Ich habe bereits meinen Code nach der Idee von CL und seine Arbeit .. aber ich werde auch durch die Post gehen .. Danke @John Fowler .. – user2058890

+0

@John Fowler Ich möchte SequelSphere wissen Ist die Unterstützung offline oder nicht? –

+0

@Kanna SequelSphere unterstützt offline (mithilfe einer App-Cache-Manifestdatei). Es speichert seine Daten entweder in IndexedDB oder LocalStorage (in dieser Reihenfolge basierend auf dem, was der Browser unterstützt). –

0

Es ist ein bisschen spät, aber für das, was es wert ist ... Sie können die Aufrufe nicht synchron ausführen, aber Sie können Ihren Code vereinfachen, indem Sie eine Bibliothek wie Async verwenden. Es mag wie Overkill aussehen, aber wenn Sie 3 oder 4 Anweisungen hintereinander ausführen müssen, kann es Ihren Code viel einfacher lesen.

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); 
    } 
]); 
0

Ich bin ein paar Jahre zu spät, aber das ist die Frage nie direkt beantwortet erwog, ich dachte, ich meine zwei Cent in werfen würde, aber auch ass einige Vorschläge hinzufügen!

Erstens, wenn Sie dies lesen, sollten Sie wahrscheinlich nicht WebSQL verwenden. Es wurde deprecated zugunsten von IndexedDB, die zu diesem Zeitpunkt die einzige Datenbank auf der W3C-Standards ist.

Wenn Sie, aus welchem ​​Grund auch immer, WebSQL verwenden möchten, und ohne die Vorteile seiner asynchronen API leben können (einige davon sind in John Fowlers Antwort erwähnt), sollten Sie auch dessen Spezifikation kennen definiert eine synchronous API.

Also, es gibt eine Möglichkeit, Anweisungen in WebSQL synchron auszuführen, vorausgesetzt, die Browser, für die Sie entwickeln, haben die synchrone API implementiert.

Wenn es Ihnen nichts ausmacht, mit einer asynchronen Schnittstelle zu arbeiten, die so einfach wie eine synchrone ist, lesen Sie BakedGoods.

Damit Ihre Anfrage Ausführung ist so einfach wie:

bakedGoods.getAll({ 
    filter: "valueObj.holdingType === 'month'", 
    storageTypes: ["webSQL"], 

    //Contains database configuration data and operation preferences 
    options: optionsObj, 

    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){} 
}); 

Sein einfaches Interface und unübertroffene Lager Unterstützung auf Kosten des Mangels für einige Speicheranlagenspezifische Konfigurationen von Support kommt. Zum Beispiel unterstützt es nicht die Durchführung von Speicheroperationen in WebSQL-Tabellen mit mehrspaltigen Primärschlüsseln.

Also, wenn Sie diese Arten von Funktionen intensiv nutzen, möchten Sie vielleicht woanders suchen.

Oh, und aus Gründen der vollständigen Transparenz, wird BakedGoods von mir erhalten :).