2013-12-10 24 views
1

我試圖使用WebSQL API與async.js,使它更容易使用。我使用方法async.waterfall()將事務對象從一個函數傳遞到另一個函數。這裏有一個簡單的例子:使用WebSQL與async.js,導致InvalidStateError

async.waterfall([function(callback) { 
    db.transaction(function(tx) { 
     callback(null, tx); 
    }, onError); 

}, function(tx, callback) { 
    tx.executeSql('SELECT * FROM sqlite_master', [], function(tx, rs) { 
     callback(null, tx, rs); 
    }, onError); 

}], function(tx, rs) { 
    // do something with rs.rows 

}); 

當我打電話tx.executeSql() Chrome的控制檯說:Uncaught InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable.
很可能這是指tx對象。

使用WebSQL的傳統方式(創建'函數瀑布')工作正常。有什麼我不得不注意以這種方式使用WebSQL?還是有更好的選擇?

+0

爲什麼你要傳遞的交易對象? – Astronaut

+1

因爲我需要它來執行SQL語句。有沒有我不知道的替代品呢? –

回答

2

好吧,我發現WebSQL由於某種原因不能與async.waterfall()一起工作。以下代碼使用async.series(),工作正常。此外,當您將功能transaction()包裝在waterfall()附近時,它不起作用。

儘管如此,waterfall()會在某些情況下不錯...

工作實例與series()transaction()

db.transaction(function(tx) { 
    async.series([ 
     function(callback) { 
      tx.executeSql('DROP TABLE IF EXISTS colors', [], 
       function(tx, rs) { callback(null, rs); }, 
       function(err) { callback(err); }); 
     }, 
     function(callback) { 
      tx.executeSql('CREATE TABLE IF NOT EXISTS colors (name, red, green, blue)', [], 
       function(tx, rs) { callback(null, rs); }, 
       function(err) { callback(err); }); 
     }, 
     function(callback) { 
      tx.executeSql('INSERT INTO colors VALUES ("red", 255, 0, 0)', [], 
       function(tx, rs) { callback(null, rs); }, 
       function(err) { callback(err); }); 
     }, 
     function(callback) { 
      tx.executeSql('SELECT * FROM colors', [], 
       function(tx, rs) { callback(null, rs); }, 
       function(err) { callback(err); }); 
     } 
    ], 
    function(err, results) { 
     if (!!err) { onError(err); } 

     console.debug(results[3].rows.item(0)); 
    }); 
}); 
+0

根據http://pouchdb.com/2014/10/26/10-things-i-learned-from-reading-and-writing-the-pouchdb-source.html,WebSQL在返回到事件循環時自動消除事務。這可能解釋了爲什麼async.series可以工作,但async.waterfall不能 –