我怎么可以这样写一个jQuery的递延功能 [英] How can I write this as a jQuery deffered function

查看:147
本文介绍了我怎么可以这样写一个jQuery的递延功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要得到数据库中所有的表,然后我一个删除之一。然而,每个 DROP TABLE 是asnyc。 最重要返回的承诺,只应在所有的表都被丢弃解决。

I need to get ALL the tables in the database and then I delete them one by one. However each DROP TABLE is asnyc. Most importantly the returned promise should only be resolved when all the tables have been dropped.

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;
},

执行有四个参数, SQL 参数 successCallback errorCallback

Execute takes four parameters, sql, arguments, successCallback and errorCallback.

推荐答案

这个怎么样:

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/

Here is a similar example 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 与它在其中创建另一个延迟对象,将接受ñdeferreds其<​​code>在。只要他们都解决了 - 最后的匿名与结束进程显示

Description: first function getTables returns deferred object with result of ajax request. We pipe another function dropTables with it and create in it another deferred object, that will accept N deferreds to its when. And as long as they are resolved - final anonymous with process finished is shown

这篇关于我怎么可以这样写一个jQuery的递延功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆