2013-02-10 15 views
6

Rozważmy:Jak wykonać synchronizację zapytania WebSQL?

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

Problemem jest to, że ROWS NOT FOUND pojawia się, ponieważ transakcja nie została zakończona do czasu oświadczenie if została osiągnięta.

Odpowiedz

5

Asynchroniczne wywołanie zwrotne nie jest zsynchronizowane, niezależnie od tego, jak bardzo ma ono wyglądać.

Wystarczy przesunąć wszystkie KODEKSU zależy od wyniku do callback:

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

    }); 
} 

Alternatywnie, przenieść go do drugiej funkcji, a które nazywamy z zwrotnego.

+0

@Michael Aby zadać pytanie, użyj przycisku "Zadaj pytanie". –

0

Według mojej wiedzy, WebSQL nie obsługuje synchronicznych instrukcji SQL. Zazwyczaj jest to dobra rzecz, ponieważ nie chcesz, aby przetwarzanie SQL zakłócało lub blokowało twój interfejs użytkownika. Jako taka, odpowiedź CL. Zapewnia odpowiedni asynchroniczny mechanizm przetwarzania wyników do zapytania.

Jeśli jednak naprawdę zależy Ci na synchronicznych zapytaniach SQL, sprawdź wersję WebSQL: SequelSphere - An HTML5/JavaScript SQL Relational Database.

Jest to w 100% JavaScript, więc działa w dowolnej przeglądarce i na dowolnej platformie. Dodatkowo przechowuje swoje dane w IndexedDB lub LocalStorage. Zawiera również wiele dzwonków i gwizdków, których nie ma WebSQL: integracja JSON, śledzenie zmian, funkcje SQL zdefiniowane przez użytkownika, przetwarzanie SQL SYNCHRONOUS itd. Ponieważ standard WebSQL został uznany za przestarzały, uważam, że jest to doskonała alternatywa.

Pełne ujawnienie: Uwielbiam WebSQL, ale jestem żonaty z SequelSphere.

+0

Dziękuję za informację ... Naprawiłem już mój kod zgodnie z pomysłem CL i jego działaniem .. ale przejdę przez pocztę też .. Dziękuję @John Fowler .. – user2058890

+0

@John Fowler Chcę poznać SequelSphere jest wsparcie w trybie offline, czy nie? –

+0

@Kanna SequelSphere obsługuje obsługę trybu offline (przy użyciu pliku manifestu pamięci podręcznej aplikacji). Przechowuje swoje dane w IndexedDB lub LocalStorage (w tej kolejności, w zależności od tego, co obsługuje przeglądarka). –

0

Trochę za późno, ale za to, co jest warte ... nie można wykonywać połączeń synchronicznie, ale można uprościć kod przy użyciu biblioteki, takiej jak Async. To może wydawać się przesadą, ale jeśli musisz wykonać 3 lub 4 polecenia z rzędu, możesz sprawić, że twój kod będzie dużo łatwiejszy do odczytania.

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

Jestem kilka lat późno, ale biorąc pod uwagę, że kwestia nigdy nie została bezpośrednio odpowiedział Pomyślałem rzucam moje dwa grosze, a także ass dodać kilka propozycji!

Po pierwsze, jeśli czytasz to, prawdopodobnie nie powinieneś używać WebSQL. Został on deprecated na rzecz IndexedDB, który w tym momencie jest jedyną bazą danych na ścieżce standardów W3C.

Jeśli z jakiegoś powodu zamierzasz używać WebSQL i możesz żyć bez zalet, które oferuje jego asynchroniczne API (niektóre z nich są wymienione w odpowiedzi Johna Fowlera), to powinieneś wiedzieć, że jego specyfikacja definiuje synchronous API.

Tak, istnieje sposób na synchroniczne wykonywanie instrukcji w WebSQL, pod warunkiem, że przeglądarki, dla których pracujesz, zaimplementowały synchroniczny interfejs API.

Jeśli nie masz nic przeciwko interfejsowi asynchronicznemu, który jest tak prosty jak synchroniczny, sprawdź kod BakedGoods.

Wraz z nim, wykonując zapytanie jest tak proste, jak:

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

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

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

Jego prosty interfejs i niezrównaną obsługą obiektu przechowywanie kosztem braku wsparcia dla niektórych konfiguracjach obiektu specyficzne magazynowych. Na przykład nie obsługuje prowadzenia operacji przechowywania w tabelach WebSQL za pomocą wielokolumnowych kluczy podstawowych.

Jeśli więc intensywnie korzystasz z tego typu funkcji, możesz poszukać gdzie indziej.

Aha, i ze względu na całkowitą przejrzystość, BakedGoods jest utrzymywany przez Ciebie naprawdę :).

Powiązane problemy