2012-05-11 3 views
1

비동기 작업 체인에 의존하기 때문에 두 가지 기능에 문제가 있습니다. clearAll은 데이터베이스를 비운 다음 페이지를 다시로드해야하는 클릭 이벤트입니다. Clear은 데이터베이스 모듈 (database.clear)의 함수입니다.비동기 JS 프로세스 재 작성 (JQuery Promise 사용 가능)

JQuery Promises/Deffered를 적절하게 사용하고 싶습니다. 그러나이 유스 케이스에 대해서는 상당히 이해할 수 없습니다. 내가 @Larry K의 대답

clearAll: function() 
    { 
     var refresh = function() 
     { 
      localStorage.clear(); 
      sessionStorage.clear(); 
      window.location.href = window.location.pathname; 
      console.log("feeling refreshed"); 
     }; 

     database.open(); 

        //This is what I'd like to be able to do 
        //With Jquery or callbacks 
     $.when(database.clear()).then(refresh); 

    }, 

clear: function (callback, errorCallback) 
{ 
    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); 
     } 
    }; 

    execute(sql, args, dbTableNamesResult); 
}, 
+0

비동기 흐름이 많은 경우 https://github.com/caolan/async를 확인하십시오. 세상을 행복한 곳으로 만듭니다. –

+0

@Ekin 나는 asnyc 흐름이 많고 async.js는 티켓처럼 보입니다. 하지만 전체 코드를 다시 작성하기 전에 위의 코드가 Async.js에서 어떻게 실행되는지 보여 줄 수 있습니까? 나는 우리가 말하는 것처럼 그것을 내고있다. – JonWells

답변

0

큰 문제 다음 코드를 다시 작성했습니다

는 두 번째 계층에 대한 루프를 포함하여 콜백의 두 개의 층을 가지고있다.

당신은 즉시 많은 database.dropTable 메소드를 호출하고 이후 여러 drop table 통화를 대기 위해 DB를 사용하고 (완료하기 전에 일을 기다리지 않고.)

괜찮

하지만 더 쉬운 방법을 문제가 해결 모든 테이블을 한 번에 삭제할 수 있습니다. SQLite manual에는 여러 개의 테이블 삭제 SQL 문이 지원된다고 나와 있습니다. 하지만 아마도 테스트를 원할 것입니다.

SQL 호출에 대해 랩퍼 라이브러리를 사용하고있는 것으로 보입니다. 그렇습니까? 내 코드에 표시된 execSQL 메소드에 대한 적절한 호출을 사용하십시오.

또한 새로 고침 기능이 drop table 문의 성공과 실패 모두에 대해 호출됩니다. AFAIK, 너는 결코 너의 errorCallback에 전화하지 않을거야. 나는 시도를하려는 :

var clearDatabase = function (successCallback, errorCallback) { 
    var dbTableNamesResult = function (tx, result) {   
     var sql1 = '', 
      rows = result.rows; 

     for (var i = 0; i < rows.length; i++) { 
      sql1 = sql1 + " DROP TABLE " + rows.item(i).name + ";"; 
     } 

     //now make one call to drop multiple tables... 
     database.execSQL(sql1, successCallback, errorCallback); 
      // pseudo function, update as appropriate 
     } 

    database.open(); 
    database.query(
    "SELECT name FROM sqlite_master WHERE type='table' AND name != ?", 
    ['__WebKitDatabaseInfoTable__'], dbTableNamesResult); 
}; 

clearDatabase이 successCallback 및 errorCallback을 모두 제공해야 호출하는 기능을

을 추가했다. 오류가 발생하는 경우,

내가 successCallback 및 errorCallback 함수가 DB에 의해 직접 호출 할 수 있다는 것을 알 수

업데이트 ... 다시 시도하거나 단지를 기록 중. 코드를 업데이트했습니다. 이 답변에 사용

자원

HTML5 바위 : Client-Side Storage

Getting Started with HTML5 Local Databases

SQLite는 SQL As Understood By SQLite

+0

안녕 래리, 나는 내 코드에 많은 차이를 실제로 볼 수 없다.일반 데이터베이스 기능은 모든 테이블이 h 제된 경우에만 succesCallback을 실행해야합니다. 스 니펫은 삭제 된 각 테이블에서 successCallback을 실행합니다. 한꺼번에 그들을 버리면 분명히 이것을 우회 할 것입니다. – JonWells

+0

죄송합니다. 루프를 제대로 닫지 않았습니다. 이 아이디어는 multi_statement "Drop table foo; Drop table bar;"로 실행되는 하나의 SQL입니다. 따라서 하나의 성공 또는 실패 콜백. 또한 내 버전이 원본보다 짧음에 유의하십시오. –

+0

좋은 생각 인 @Larry이지만 불행히도 여러 명령으로 작동하지 않는 것 같습니다 "DROP TABLE foo; DROP TABLE bar"; – JonWells