【问题标题】:Jquery Deferred - Is this a scope? Syntax?Jquery Deferred - 这是一个范围吗?句法?
【发布时间】: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


【解决方案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 调用实际上没有失败,您可以在控制台中检查。

【讨论】:

  • 感谢您的评论!我添加到原始问题并合并了您的代码(需要反转 $.map 中 anon 函数中的值)。它有所帮助,但它仍然没有像我希望的那样运作。见上文。
  • 嘿——忽略最后一条评论!我在 db builder 文件中发现了一个错误,导致它挂在重新加载的实例上。朱利安,您的代码运行良好,谢谢!你在我的圣诞名单上!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 2019-02-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多