2017-07-02 16 views
0

アムimplemenmtingチェーンの約束に失敗したが、1つの機能は、私はこれは私が チェーンの約束はionic2ネイティブのsqlite

openDb(): Promise<boolean> { //opens database 
    return new Promise((resolve, reject) => { 
     this.sqlite.create({ 
      name: this.dbname, 
      location: this.dblocation 
     }) 
      .then((db: SQLiteObject) => { 
       this.database = db; 
       resolve(true) 
      }) 
      .catch(e => reject(e.message)); 
    }); 
} 

を実装している方法です約束

1. open database 
2. add record // incase record exists remove it 
3. remove record called from no 2 

を返し、次のような機能を持っている基本的 を実行することに失敗しました

その後、レコードを追加

add(item: string, value: any): Promise<boolean> { 
    return new Promise((resolve, reject) => { 
     this.openDb() 
      .then(() => { 
       this.database.transaction(
        (tx: any) => { 
         tx.executeSql(` 
          CREATE TABLE IF NOT EXISTS '${tbl_name}' 
           (item_id INTEGER PRIMARY KEY AUTOINCREMENT, item unique, value)`); //incase tbl not there 

         this.remove(item) //next function which gets executed 
          .then(() => { 

           ///THIS PART IS NEVER EXECUTED 
           tx.executeSql(` 
           INSERT INTO '${tbl_name}' (item, value) VALUES(?, ?)`, [item, value], 
            (t: any, results: any) => { 
             console.log("executed successifully"); 
             resolve(true) 
            }, 
            (t: any, message: any) => { 
             console.log("Failed to execute"); 
             reject(false) 

            }) 
          }) 
          .catch(reject(false)) 
        } 
       ); 

      }) 
      .catch(e => reject(e.essage)); 
    }); 
} 

のTh電子取り除きアイテム機能は

remove(item: string): Promise<boolean> { 
    return new Promise((resolve, reject) => { 
     this.openDb() 
      .then(() => { 
       this.database.transaction(
        (tx: any) => { 
         tx.executeSql(` 
           DELETE FROM '${tbl_name}' WHERE item ='${item}' 
           `, [], 
          (t: any, results: any) => { 
           console.log("executed successifully"); 
           resolve(true) 
          }, 
          (t: any, message: any) => { 
           console.log("Failed to execute"); 
           reject(false) 

          }) 
        } 
       ); 

      }) 
      .catch(e => reject(e.essage)); 
    }); 
} 

削除項目がsuccessifully実行されますが、追加ブロックが間違っている可能性がどのようなエラーが

InvalidStateError: DOM Exception 11: This transaction is already finalized. 
Transactions are committed after its success or failure handlers are called. 
If you are using a Promise to handle callbacks, be aware that implementations 
    following the A+ standard adhere to run-to-completion semantics 
    and so Promise resolution occurs on a subsequent tick and therefore 
    after the transaction commits 

を投げられるinsted実行されることはありませんか?

+0

あなたのコードを読んでいるときには、いくつか心配することがあります。 ** 1)**あなたは[明白な約束の反パターン]を約束します(https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-避けてください)。あなたが使っているsqliteライブラリのような約束ベースのAPIでは、新しい約束を構築することは決して*必要ではなく、それをしない理由があります。 'new Promise()'、 'reject()'、 'resolve()'を呼び出すすべての行を削除します。 ** 2)**健全なデータベース設計では、ダイナミックに名前のついたテーブルを作成する必要はありません。あなたのDBを再編集してください。 – Tomalak

+0

** 3)**プロミスベースのAPIを使用していて、コールバック地獄のようなコード(横向きのピラミッドのような)で終わっても、何か間違っています。あなたのコードを平らにする。 (この場合、不必要な複雑さの多くは、余分な約束の作成を取り除くと消えてしまいます)動的な名前のついたテーブルを作成する部分を打ち消すと、さらに消えてしまいます。 – Tomalak

+0

DB設計に関する最終ヒント:同じ列であるが名前が異なる場合、実際にやりたいことは、追加の「カテゴリ」列を持つ単一の表を作成することです。アプリケーションがDBスキーマを通常の操作の一部として変更しないようにしてください。これは災害のためのレシピです。 – Tomalak

答えて

0

this.remove(item)のコールバックが、this.database.transactionコールの完了後に非同期に実行されるため、テーブルに追加しようとするとトランザクションが終了します。

関連する問題