1

我正在尝试将 WebSQL API 与 async.js 一起使用以使其更易于使用。我使用该方法async.waterfall()将事务对象从一个函数传递到另一个函数。这是一个简单的例子:

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 有什么需要注意的吗?还是有更好的选择?

4

1 回答 1

2

async.waterfall()好的,我发现 WebSQL出于某种原因无法使用。下面的代码,使用async.series(),工作正常。同样,当您将函数包装transaction()在 a 周围时,waterfall()它也不起作用。

不过,waterfall()在某些情况下会很好......

series()inside的工作示例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));
    });
});
于 2013-12-11T09:39:27.060 回答