WebDB 環境内で一連の sqlite クエリを同期的に実行する方法を作成しようとしています。同期ルーチンに相当すると思われるものを思いつきましたが、それをテストする方法がわかりません。ここに私が持っているものがあります:
var db = openDatabase("test1", "1.0", "test", 5 * 1024 * 1024);
function synchronousSql(tx, sqlStack, callback) {
if (sqlStack.length !== 0) {
var q = sqlStack.shift();
console.log(+new Date() + ' ' + q);
tx.executeSql(q, [], synchronousSql(tx, sqlStack, callback), null);
} else {
callback();
}
}
var seq = [
'drop table if exists table1',
'drop table if exists table2',
'drop table if exists table3',
'drop table if exists table4',
'drop table if exists table5',
'create table table1(id integer, value text)',
'create table table2(id integer, value text)',
'create table table3(id integer, value text)',
'create table table4(id integer, value text)',
'create table table5(id integer, value text)',
'drop table if exists table1',
'drop table if exists table2',
'drop table if exists table3',
'drop table if exists table4',
'drop table if exists table5'
];
db.transaction(function(tx) {
synchronousSql(tx, seq, function() {
console.log(+new Date() + ' - from synchronousSql callback');
});
}, null, function() {
console.log(+new Date() + ' - from transaction callback');
});
紙の上では(私は思う)それはうまくいくはずです。それを見ると、最後のステートメントが実行されたときに警告メッセージが表示されると思いますが、必ずしもそれが戻ったときではありませんが、それを修正する方法がわかりません。関数の引数にコールバックを指定しようとしましたsynchronousSql
が、コールバックを使用して再帰的に呼び出す必要があり、空の匿名関数を使用すると、目的のコールバックが上書きされたように見えました。
したがって、2 つの質問があると思います。まず、これは本当に同期的ですか。次に、スタックの最後のコールバックで実行する最終コールバックを実装するにはどうすればよいですか?
edit : コードを最新バージョンに更新しました。ただし、最初の疑問は依然として残っています。これは本当に同期なのですか?