2012-05-16 60 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

相關問題