2

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 : コードを最新バージョンに更新しました。ただし、最初の疑問は依然として残っています。これは本当に同期なのですか?

4

1 に答える 1

0

コードにanalert()と asetTimeout()を入れて、それらがすべて同時に実行されるか、分離されるかをテストします。それは通常、それをテストするためのかなり良い方法です。すべてのコードが同時に実行される場合 (非同期)、非表示にするアラートが即座に 10 個あります。それ以外の場合は、x ミリ秒ごとに 1 つ取得されます。

2 番目の質問: スタックが空かどうかを確認してください。ただし、おそらく関数を介して 3 番目の変数を渡す必要があります。グローバルスコープで変数を定義しない限り、上書きされません。

于 2011-11-30T22:37:54.883 に答える