【发布时间】:2011-06-19 01:15:05
【问题描述】:
我有一个清理数据库的常用例程:
function clearDB() { // Clears the database based on code in the file "db_definition.js".
var dwdb_dfd = $.Deferred();
var idx = 0;
this.maxDeletes = g_sSQL_dropWorkoutDB.length;
this.successCount = 0;
parentThis = this;
do {
$.when(transactDB(g_sSQL_dropDB[idx])).done(function() {
if(parentThis.successCount++ >= parentThis.maxDeletes) dwdb_dfd.resolve();
});
} while (++idx < this.maxDeletes);
return dwdb_dfd.promise();
}
这个例程是从以下位置调用的:
this.getNextDataSet = function() {
$.when(clearDB()).done(function() {
window.location.href = 'http://'+ document.location.host + '/webDBBuilder.php'
}
WebDBBuilder.php 是一个文件,它从我们的服务器读取数据并从服务器数据库上的可用数据构建/重建本地 WebDB(尽管有 W3C,该死的。我们早在他们放弃我们之前就开始了)。当轮询服务器的例程标记新数据可用时,将调用此例程。然后我们销毁本地数据库中的某些表——全局变量g_sSQL_dropDB 只是一个DROP TABLE IF EXISTS tbl_someTable 字符串数组。
transactDB() 例程是另一个延迟承载函数,它执行传递给它的 SQL 语句。 transactDB() 正在按要求工作,因为有问题的表正在被正确删除,并且在应用程序的其余部分中使用。 getNextDataSet() 函数是较大对象的一部分。它被正确调用。
问题是页面跳转根本不会发生。这是 clearDB() 函数中的 Deferred 对象的某种范围问题吗?
我缺少代码中的某些内容吗?我尝试过使用 done()、resolve()、$.when().then()。纳达。
任何帮助将不胜感激。我在 jQuery 论坛上问了几个问题,基本上没有任何回应,所以我想我在这里使用 stackoverflow 会有更好的运气!
感谢您的宝贵意见。我使用了 Julian 给我的代码(使用 $.map 的小语法切换),它运行得非常好!
您对函数中的“this”引用是正确的。我之前从课堂上提取了一些代码,只是脑子里放了个屁。 var "g_sSQL_dropWorkoutDB" 确实是一个全局变量,它位于一个包含文件中,该文件仅包含用于构建和删除数据库的变量。
朱利安,非常感谢!
斯科特。
【问题讨论】:
-
我不能说我使用了 jQuery 的 when 函数。在您的 transactDB 调用中,您是否在执行 ajax 请求?我将根据来自 ajax 请求的回调执行匿名函数,而不是进行 when 调用。
-
我实际上没有进行 ajax 调用(尽管在后续版本中,我们可能会实现它。)这是一个旨在离线运行的移动应用程序它必须——这意味着它需要到达服务器以获取数据,但在完成之后,不需要网络连接。在这种情况下,主文件(删除表的那个)是严格的 javascript/html 以允许我们正确缓存它。另一个文件是一个独立的 php 文件,此时不需要是 ajax 调用,但正如我所说,这可能是我们要去的地方。感谢您的意见!
标签: jquery sqlite jquery-deferred web-sql