2012-05-11 18 views
1

2つの機能に問題があるのは、非同期タスクの連鎖に依存しているためです。 clearAllはクリックイベントで、データベースを空にしてからページをリロードする必要があります。 Clearは、データベースモジュール(database.clear)の関数です。Async JSプロセスを書き直してください(おそらくJQuery Promiseを使用しています)

私は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); 
}, 
+0

多くの非同期フローがある場合は、https://github.com/caolan/asyncをご覧ください。世界を幸せな場所にします。 –

+0

@Ekin私はasnycの流れがたくさんあり、async.jsはチケットのように見えます。しかし、コードを全部書き直す前に、Async.jsで上記のことがどのように実行されるのかを教えてください。私は話すようにそれを与えている – JonWells

答えて

0

大きな問題以下のコードを再書かれている

あなたは第二層のためのループを含むコールバックの2層を有することです。

あなたはすぐに多くのdatabase.dropTableメソッドを呼び出しているので、複数のdrop tableのコールをキューにDBを使用している(完了させる前に1を待たず。)

大丈夫です

が、簡単な方法を課題を解決するために一度にすべてのテーブルを削除します。 SQLite manualには、複数の表drop sql文がサポートされていると記載されています。しかし、おそらくそれをテストしたいと思うでしょう。

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

また、drop table文の成功と失敗の両方に対して、リフレッシュ関数が呼び出されています。 AFAIK、あなたは決して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機能は、DBから直接呼び出すことができるということがわかります。コードを更新しました。この回答に使用

リソース

HTML5ロックス:Client-Side Storage

Getting Started with HTML5 Local Databases

SQLiteのSQL As Understood By SQLite

+0

こんにちはラリー、私はあなたのコードに私の多くの違いを実際に表示されません。clearデータベース関数は、すべてのテーブルが削除されたときにのみsuccesCallbackを実行する必要があります。スニペットは、削除された各テーブルに対してsuccessCallbackを実行します。一度にそれらを落とすことは明らかにこれを巡回するだろう。 – JonWells

+0

おっと、ループを正しく閉じていませんでした。考え方は、multi_statement "Drop table foo; Drop table bar;"で1つのsqlを実行することです。したがって、1つの成功または失敗のコールバック。また、私のバージョンは元のバージョンよりも短いことに注意してください。 –

+0

それは良い考えです@ラリーが、残念ながらそれは複数のコマンド "DROP TABLE foo; DROP TABLE bar"で動作するようには見えません。 – JonWells

関連する問題