【问题标题】:How can I write this as a jQuery deffered function我怎样才能把它写成一个 jQuery 延迟函数
【发布时间】:2012-05-16 09:05:58
【问题描述】:

我需要获取数据库中的所有表,然后将它们一一删除。但是每个DROP TABLE 都是异步的。 最重要的是返回的 Promise 只有在所有表都被删除后才能解决。

clear: function() {
    var dfd = $.Deferred();
    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, null, errorCallback);
        }
    };

    execute(sql, args, dbTableNamesResult, dfd.reject);
    return dfd;
},

Execute 接受四个参数,sqlargumentssuccessCallbackerrorCallback

【问题讨论】:

标签: jquery asynchronous jquery-deferred web-sql


【解决方案1】:

这个怎么样:

clear: function() {
    var dfd = $.Deferred();
    var sql = "SELECT name FROM sqlite_master WHERE type='table' AND name != ?",
    args = ["__WebKitDatabaseInfoTable__"];

    dfd.pipe(function(tx, result) {
        var deferreds = [];

        for (var i = 0; i < result.rows.length; i++) {
            var dfd = $.Deferred();
            dropSql = "DROP TABLE IF EXISTS " + result.rows.item(i).name + "; ";
            execute(dropSql, dfd.resolve, errorCallback);
            deferreds.push(dfd);
        }

        return $.when.apply(null, deferreds);
    });

    execute(sql, args, dfd.resolve, dfd.reject);
    return dfd;
},

这是一个类似的例子http://jsfiddle.net/zerkms/XQwPq/

function getTables()
{
    var dfd = $.Deferred();

    $.ajax({
        url: '/echo/json/',
        data: {
            json: '{"tables":["a","b","c"]}',
            delay: 1
        },
        type: 'post',
        dataType: 'json',
        success: function(response) {
            dfd.resolve(response.tables);             
        }
    });

    return dfd;
}

function dropTables(tables)
{
    console.log('tables to delete: ' + tables.join(', '));

    var deferreds = [];

    for (var i = 0, len = tables.length; i < len; i++) {
        var dfd = $.Deferred();
        (function(dfd) {
            $.ajax({
                url: '/echo/json/',
                data: {
                    json: '{"table":"' + tables[i] + '"}',
                    delay: Math.random() * 3
                },
                type: 'post',
                dataType: 'json',
                success: function(response) {
                    console.log('table ' + response.table + ' deleted');
                    dfd.resolve();             
                }
            });
        })(dfd);

        deferreds.push(dfd);
    }

    return $.when.apply(null, deferreds);
}

getTables().pipe(dropTables).done(function() {
    console.log('process finished');
});
​

描述:第一个函数getTables返回延迟对象和ajax请求的结果。我们用它管道另一个函数dropTables,并在其中创建另一个延迟对象,它将接受N个延迟到它的when。只要它们得到解决 - 就会显示带有 process finished 的最终匿名

【讨论】:

  • 我不知道这是做什么的,但我会查一下并进行测试!我以前从未见过“$.when.apply”。 for循环中的执行,应该是dfd.reject吗?
  • @CrimsonChin:不。给我一点时间来编写一些 jsfiddle 示例
  • 很有魅力,谢谢!更何况这个例子。我做梦也想不到
  • 好的,如果在删除表时出现错误,拒绝原始的延迟 obj 是否有意义?
  • @CrimsonChin:这里演示了jsfiddle.net/zerkms/XQwPq/1 会发生什么。这取决于您想要实现的目标
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2018-03-26
  • 2021-12-13
  • 2023-03-13
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多