2013-02-10 74 views
6

考慮:如何使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"); 
    } 
} 

的問題是,ROWS NOT FOUND出現因爲交易還沒有被達到if聲明的時間內完成。

回答

5

異步回調不是同步的,不管你想要多少。

只是移動所有的要看結果步入回調代碼:

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

    }); 
} 

或者,將其移動到第二個函數,調用從回調。

+0

@Michael要問一個問題,請使用「Ask Question」按鈕。 – 2016-11-26 20:40:53

0

據我所知,WebSQL不支持同步SQL語句。這通常是一件好事,因爲您不希望SQL的處理破壞或凍結您的用戶界面。因此,CL。的答案爲查詢處理結果提供了正確的異步機制。

但是,如果您確實需要同步SQL查詢,請檢查WebSQL備選項:SequelSphere - An HTML5/JavaScript SQL Relational Database

它是100%的JavaScript,因此它可以在任何瀏覽器和任何平臺上運行。另外,它將數據存儲在IndexedDB或LocalStorage中。它還包含WebSQL不支持的許多花裏胡哨的東西:JSON集成,更改跟蹤器,用戶定義的SQL函數,SYNCHRONOUS SQL處理等。由於WebSQL標準已被棄用,我認爲這是一個很好的選擇。

完全披露:我喜歡WebSQL,但我已經結婚了SequelSphere。

+0

感謝您的信息...我已經根據CL的想法和其工作已經解決了我的代碼..但我也將通過帖子..謝謝你@John Fowler .. – user2058890 2013-02-12 09:00:23

+0

@John Fowler我想知道SequelSphere支持離線還是不支持? – 2013-08-30 09:59:47

+0

@Kanna SequelSphere支持脫機(使用應用程序緩存清單文件)。它將數據存儲在IndexedDB或LocalStorage中(按照瀏覽器支持的順序)。 – 2013-08-30 15:55:11

0

現在有點晚了,但對於它的價值......你不能使呼叫同步,但你可以通過使用庫如Async來簡化你的代碼。看起來似乎過度殺毒,但如果你需要連續執行3或4條語句,它可以使你的代碼更容易閱讀。

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

我一對夫婦的晚年,但考慮到這個問題從來沒有直接回答,我想我應該把我的兩分錢中,還有屁股添加一些建議!

首先,如果您正在閱讀本文,您可能不應該使用WebSQL。它已被deprecated贊成IndexedDB,它目前是W3C標準軌道上唯一的數據庫。如果出於任何原因,你打算使用WebSQL,並且你可以沒有異步API提供的好處(其中一些在John Fowler的答案中提到),那麼你應該知道它的規範也是定義了synchronous API

所以,是的,有一種方法可以在WebSQL中同步執行語句,前提是您正在開發的瀏覽器已經實現了同步API。

如果您不介意處理異步接口,就像同步接口一樣簡單,請檢查BakedGoods

有了它,執行查詢很簡單,只要:

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

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

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

其簡單的界面和無與倫比的存儲設備支持是在缺乏一些存儲設施的具體配置的支持成本。例如,它不支持使用多列主鍵的WebSQL表中的存儲操作。

所以,如果你大量使用這些類型的功能,你可能想看看其他地方。

哦,爲了完全透明,BakedGoods由您真正維護:)。