1

非同期タスクのチェーンに依存しているため、2 つの関数で問題が発生しています。これclearAllは、データベースを空にしてからページをリロードするクリック イベントです。 Clearは、データベース モジュール ( database.clear) の関数です。

適切であれば JQuery Promises/Deffered を使用したいと思いますが、このユースケースではそれらを完全に把握できません。

@Larry Kの回答に従ってコードを書き直しました

    clearAll: function()
    {
        var refresh = function()
        {
            localStorage.clear();  
            sessionStorage.clear();
            window.location.href = window.location.pathname;
            console.log("feeling refreshed");
        };

        database.open();

                    //This is what I'd like to be able to do
                    //With Jquery or callbacks
        $.when(database.clear()).then(refresh);

    },

clear: function (callback, errorCallback)
{
    var sql = "SELECT name FROM sqlite_master WHERE type='table' AND name != ?",
    args = ["__WebKitDatabaseInfoTable__"];

    var dbTableNamesResult = function (tx, result)
    {
       var dropSql  = "";

       for (var i = 0; i < result.rows.length; i++)
       {
        dropSql = "DROP TABLE IF EXISTS " + result.rows.item(i).name + "; ";
        execute(dropSql);
       }
    };

    execute(sql, args, dbTableNamesResult);
},
4

2 に答える 2

0

jQuery deferred を自分で実装しようとしましたが、探していた答えは、これを jQuery defered function として書くにはどうすればよいですか?に対する zerkms の回答によって提供されました。

于 2012-05-18T09:41:38.893 に答える
0

大きな問題は、2 番目のレイヤーのループを含む 2 つのレイヤーのコールバックがあることです。

(前のメソッドが完了するのを待たずに)drop tableすぐに多くのメソッドを呼び出すため、データベースを使用して複数の呼び出しをキューに入れています。database.dropTable

それは問題ありませんが、問題を解決する簡単な方法は、すべてのテーブルを一度に削除することです。SQLite マニュアルには、複数のテーブル ドロップ SQL ステートメントがサポートされていると記載されています。しかし、おそらくそれをテストしたいと思うでしょう。

SQL 呼び出しの周りにラッパー ライブラリを使用しているようですね。私のコードに示されている execSQL メソッドの適切な呼び出しを使用してください。

また、ドロップ テーブル ステートメントの成功と失敗の両方で、更新関数が呼び出されています。私の知る限り、あなたはあなたのerrorCallback. 私は試してみたい:

var clearDatabase = function (successCallback, errorCallback) {
  var dbTableNamesResult = function (tx, result) {          
        var sql1 = '',
            rows = result.rows;

        for (var i = 0; i < rows.length; i++) {
          sql1 = sql1 + " DROP TABLE " + rows.item(i).name + ";";
        }

        //now make one call to drop multiple tables...
        database.execSQL(sql1, successCallback, errorCallback);
           // pseudo function, update as appropriate
      }

  database.open();
  database.query(
    "SELECT name FROM sqlite_master WHERE type='table' AND name != ?",
    ['__WebKitDatabaseInfoTable__'], dbTableNamesResult);
};

追加した

clearDatabase を呼び出す関数は、successCallback と errorCallback の両方を提供する必要があります。エラーが発生した場合は、もう一度やり直すか、ログに記録してください...

更新しました

successCallback および errorCallback 関数をデータベースから直接呼び出すことができることがわかりました。コードを更新しました。

この回答で使用されるリソース

HTML5 Rocks:クライアント側ストレージ

HTML5 ローカル データベースの概要

SQLite SQLiteが理解する SQL

于 2012-05-11T15:22:02.563 に答える