1

DBをクリアするための一般的なルーチンがあります。

function clearDB() { // Clears the database based on code in the file "db_definition.js".
    var dwdb_dfd = $.Deferred();
    var idx = 0;

    this.maxDeletes = g_sSQL_dropWorkoutDB.length;
    this.successCount = 0;
    parentThis = this;
    do {
        $.when(transactDB(g_sSQL_dropDB[idx])).done(function() {
            if(parentThis.successCount++ >= parentThis.maxDeletes) dwdb_dfd.resolve();
        });
    } while (++idx < this.maxDeletes);
    return dwdb_dfd.promise();
}

そして、このルーチンは次の場所から呼び出されます。

this.getNextDataSet = function() {
    $.when(clearDB()).done(function() {
    window.location.href = 'http://'+ document.location.host + '/webDBBuilder.php'
}

WebDBBuilder.phpは、サーバーからデータを読み取り、サーバーDBで利用可能なデータからローカルWebDBをビルド/再構築するファイルです(W3Cにもかかわらず、私たちはこれを放棄するずっと前に開始しました)。このルーチンは、サーバーをポーリングするルーチンが新しいデータが利用可能であることを示すフラグを立てたときに呼び出されます。次に、ローカルDB内の特定のテーブルを破棄します。グローバル変数g_sSQL_dropDBは単にDROP TABLE IF EXISTS tbl_someTable文字列の配列です。

このtransactDB()ルーチンは、渡されたSQLステートメントを実行するもう1つの遅延ベアリング関数です。問題のtransactDB()テーブルが適切に削除され、アプリの残りの部分全体で使用されるため、は必要に応じて機能しています。このgetNextDataSet()関数は、より大きなオブジェクトの一部です。正しく呼び出されています。

問題は、ページジャンプが発生しないことです。clearDB()これは、関数 内のDeferredオブジェクトに関するある種のスコープの問題ですか?

私が見逃しているコードに何かがありますか?done()、resolve()、$。when()。then()を使用してみました。灘。

どんな助けでも深くいただければ幸いです。私はjQueryフォーラムでいくつか質問をしましたが、基本的に応答はありませんでした。そのため、ここではstackoverflowを使用したほうが幸運だと思いました。

<------------追加-------------->

素晴らしい入力をありがとう。私はジュリアンがくれたコードを取りました、そして($ .mapのマイナーな構文スイッチで)それは美しく働きました!

そして、あなたは関数の「this」参照について正しかった。私は以前にクラスからいくつかのコードを引き出して、単に頭のオナラを持っていました。変数「g_sSQL_dropWorkoutDB」は、データベースの構築と削除に使用される変数のみを保持するインクルードファイルに含まれるグローバルです。

ジュリアン、たくさんありがとう!

スコット。

4

1 に答える 1

1

まず第一に、コードを大幅に簡素化できます。

function clearDB() {
    return $.when.apply( $, $.map( g_sSQL_dropWorkoutDB, function( _, item ) {
        return transactDB( item );
    }) ).fail(function() {
        console.log( arguments );
    });
}

$.when.apply を使用すると、オブジェクトの配列を引数のように $.when に渡すことができます。$.map を使用して、アイテムのリストを transactDB オブジェクトに変換します。明らかに、コードをテストしていませんが、動作するはずです。

第 2 に、clearDB で「this」に変数を割り当てる方法は非常に疑わしいものです。getNextDataSet で行うように clearDB を呼び出すと、「this」がウィンドウ オブジェクトであり、その過程で maxDeletes と successCount がグローバル変数として割り当てられます。それが意図したものかどうかわからないし、安全ではないことは間違いない。

また、g_sSQL_dropWorkoutDBが引数としてclearDBに渡されないのは正常ですか? グローバル変数またはタイプミス?

最後に、失敗のコールバックを追加し、引数をログに記録しました。そうすることで、transactDB 呼び出しの 1 つが実際に失敗していないかどうかをコンソールで確認できます。

于 2011-06-19T02:40:42.937 に答える