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

네 파라미터 sql, arguments, successCallbackerrorCallback 걸린다. 아약스 요청의 결과 개체를 연기 첫 번째 함수 getTables 반환 : 여기

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

설명 유사한 예를하다 : 이것에 대해 어떻게

+1

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

답변

1

. 우리는 또 다른 함수 인 dropTables을 파이프에 넣고 N 개의 지연을 받아들이는 또 다른 지연된 객체를 when에 생성합니다. 그리고 그들이 해결되는 한 마지막 익명의 process finished이 표시됩니다.

+0

그게 무슨 일인지는 잘 모르겠지만, 그것을 찾아 내서 테스트! 나는 결코 전에 "$ .apply"를 본 적이 없다. for 루프에서 실행하면 dfd.reject가되어야합니까? – JonWells

+0

@CrimsonChin : 아니요. 제게 두 번째 예제를 작성하십시오. – zerkms

+1

@CrimsonChin : 지연에 대해 사과드립니다. http://jsfiddle.net/zerkms/XQwPq/ – zerkms