1

使いやすくするために、async.js で WebSQL API を使用しようとしています。このメソッドを使用して、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()内部での作業例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 に答える