我遇到两个函数问题,因为它们依赖于链接异步任务。 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);
},
答案 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
的回答提供的