1

我有一个清除数据库的通用例程:

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" 确实是一个全局变量,它位于一个包含文件中,该文件仅包含用于构造和删除数据库的变量。

朱利安,非常感谢!

斯科特。

4

1 回答 1

1

首先,您可以大大简化您的代码:

function clearDB() {
    return $.when.apply( $, $.map( g_sSQL_dropWorkoutDB, function( _, item ) {
        return transactDB( item );
    }) ).fail(function() {
        console.log( arguments );
    });
}

使用 $.when.apply,您可以将对象数组传递给 $.when,就好像它们是它的参数一样。我使用 $.map 将项目列表转换为 transactDB 对象。显然,我还没有测试过代码,但它应该可以工作。

其次,在 clearDB 中将变量分配给“this”的方式非常可疑。当您像在 getNextDataSet 中那样调用 clearDB 时,“this”是窗口对象,并且 maxDeletes 和 successCount 被分配为进程中的全局变量。不确定这是您的意图,而且绝对不安全。

另外,g_sSQL_dropWorkoutDB 不作为参数传递给 clearDB 是否正常?全局变量或错字?

最后,我添加了一个失败回调并记录了参数。这样,如果您的一个 transactDB 调用实际上没有失败,您可以在控制台中检查。

于 2011-06-19T02:40:42.937 回答