1

我在使用两个函数时遇到问题,因为它们依赖于链接异步任务。这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

最大的问题是你有两层回调,包括第二层的循环。

您正在使用数据库对多个drop table调用进行排队,因为您立即调用了许多database.dropTable方法(无需等待前一个方法完成。)

这很好,但解决问题的更简单方法是一次删除所有表。SQLite 手册说支持多个 table drop sql 语句。但你可能想要测试它。

看来您正在使用围绕 sql 调用的包装库,是吗?对我的代码中显示的 execSQL 方法使用适当的调用。

此外,您的 refresh 函数会被调用,用于 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 函数。更新了代码。

此答案中使用的资源

HTML5 Rocks:客户端存储

HTML5 本地数据库入门

SQLite理解的 SQLite SQL

于 2012-05-11T15:22:02.563 回答
0

尝试实现 jQuery 延迟自己我正在寻找的答案是由 zerkms 对我如何将其编写为 jQuery 延迟函数的回答提供的

于 2012-05-18T09:41:38.893 回答