2013-12-10 25 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不能 –