重写Async JS进程(可能使用JQuery Promise)

时间:2012-05-11 15:02:32

标签: javascript jquery asynchronous jquery-deferred web-sql

我遇到两个函数问题,因为它们依赖于链接异步任务。 clearAll是一个click事件,它应该清空数据库然后重新加载页面。 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);
},

2 个答案:

答案 0 :(得分:0)

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

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

这很好,但解决问题的一种更简单的方法是立即删除所有表。 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。如果出现错误,请重试或只记录它......

已更新

我看到db可以直接调用successCallback和errorCallback函数。更新了代码。

此回答中使用的资源

HTML5 Rocks:Client-Side Storage

Getting Started with HTML5 Local Databases

SQLite SQL As Understood By SQLite

答案 1 :(得分:0)

试图实现jQuery推迟了我自己寻找的答案是由zerkms对 How can I write this as a jQuery deffered function

的回答提供的