2013-02-10 18 views
6

Considerare:Come rendere sincrona una query 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"); 
    } 
} 

Il problema è che ROWS NOT FOUND appare perché la transazione non è stata completata per il momento si raggiunge la dichiarazione if.

risposta

5

Una richiamata asincrona non è sincrona, indipendentemente da quanto si desidera.

basta spostare tutto il codice dipende il risultato nella 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); 

    }); 
} 

alternativa, spostare in una seconda funzione, e chiamare che la richiamata.

+0

@ Michael Per fare una domanda, utilizzare il pulsante "Chiedi domanda". –

0

A mia conoscenza, WebSQL non supporta istruzioni SQL sincrone. Questa è normalmente una buona cosa, poiché non si desidera che l'elaborazione di SQL interrompa o blocchi l'interfaccia utente. Di conseguenza, la risposta di CL. Fornisce il giusto meccanismo asincrono per l'elaborazione dei risultati in una query.

Se, tuttavia, si desidera sinceramente query SQL sincrone, verificare l'alternativa WebSQL: SequelSphere - An HTML5/JavaScript SQL Relational Database.

È 100% JavaScript, quindi funziona su qualsiasi browser e su qualsiasi piattaforma. Inoltre, memorizza i suoi dati in IndexedDB o LocalStorage. Contiene anche molti campanelli e fischietti che WebSQL non ha: integrazione JSON, tracker dei cambiamenti, funzioni SQL definite dall'utente, elaborazione SQL SINCRONA, ecc. Poiché lo standard WebSQL è stato deprecato, penso che questa sia un'alternativa eccellente.

Full Disclosure: Adoro WebSQL, ma sono sposato con SequelSphere.

+0

Grazie per le informazioni ... Ho già corretto il mio codice in base all'idea di CL e il suo funzionamento .. ma passerò anche attraverso il post. Grazie @ John Fowler .. – user2058890

+0

@ John Fowler Voglio sapere SequelSphere il supporto è offline o no? –

+0

@Kanna SequelSphere supporta offline (utilizzando un file manifest della cache dell'app). Memorizza i suoi dati in IndexedDB o LocalStorage (in questo ordine, in base a ciò che il browser supporta). –

0

Ora è un po 'tardi ma per quello che vale ... non è possibile effettuare le chiamate in modo sincrono ma è possibile semplificare il codice utilizzando una libreria come Async. Potrebbe sembrare eccessivo, ma se hai bisogno di eseguire 3 o 4 istruzioni di seguito puoi rendere il tuo codice molto più facile da leggere.

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

Sono un paio d'anni di ritardo, ma considerando che la questione non è mai stato risposto direttamente, ho pensato di gettare i miei due centesimi in, nonché ass Aggiungi qualche suggerimento!

Innanzitutto, se stai leggendo questo, probabilmente non dovresti usare WebSQL. È stato deprecated in favore di IndexedDB, che a questo punto è l'unico database sulla traccia degli standard W3C.

Se, per qualsiasi motivo, si intende utilizzare WebSQL e si può vivere senza i vantaggi offerti dalle API asincrone (alcune delle quali sono menzionate nella risposta di John Fowler), allora si dovrebbe sapere che le sue specifiche sono anche definisce un synchronous API.

Quindi sì, c'è un modo per eseguire istruzioni in WebSQL in modo sincrono, a condizione che i browser che state sviluppando abbiano implementato l'API sincrona.

Se non ti dispiace occuparti di un'interfaccia asincrona che è tanto semplice quanto sincrona, controlla BakedGoods.

Con esso, l'esecuzione di query è semplice come:

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

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

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

la sua semplice interfaccia e il supporto impianto di stoccaggio senza pari viene al costo di mancanza di supporto per alcune configurazioni specifiche degli impianti di stoccaggio. Ad esempio, non supporta la conduzione delle operazioni di archiviazione nelle tabelle WebSQL con chiavi primarie a più colonne.

Quindi, se si fa un uso intenso di questi tipi di funzionalità, si potrebbe voler guardare altrove.

Oh, e per garantire la massima trasparenza, BakedGoods è gestito da chi è veramente :).

Problemi correlati