2012-05-16 21 views
1

我需要获取数据库中的所有表,然后逐个删除它们。然而每个DROP TABLE是asnyc。 最重要的是返回的承诺应该只在所有表被删除时才能解决。我该如何写这个作为jQuery缓冲函数

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

+1

http://api.jquery.com/deferred.pipe/ –

回答

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'); 
}); 
​ 

描述:推迟对象使用Ajax请求的结果第一功能getTables回报。我们使用它管道另一个函数dropTables并在其中创建另一个延迟对象,该对象将接受N递延到其when。只要他们解决了 - 最终匿名process finished显示为

+0

我不知道那是做什么,但我会查找它,并给它一个测试!我从来没有见过“$ .when.apply”。在for循环中的执行,应该是dfd.reject? – JonWells

+0

@CrimsonChin:不。给我一秒钟来撰写一些jsfiddle的例子 – zerkms

+1

@CrimsonChin:抱歉延迟http://jsfiddle.net/zerkms/XQwPq/ – zerkms

相关问题