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実行されることはありませんか?
あなたのコードを読んでいるときには、いくつか心配することがあります。 ** 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
** 3)**プロミスベースのAPIを使用していて、コールバック地獄のようなコード(横向きのピラミッドのような)で終わっても、何か間違っています。あなたのコードを平らにする。 (この場合、不必要な複雑さの多くは、余分な約束の作成を取り除くと消えてしまいます)動的な名前のついたテーブルを作成する部分を打ち消すと、さらに消えてしまいます。 – Tomalak
DB設計に関する最終ヒント:同じ列であるが名前が異なる場合、実際にやりたいことは、追加の「カテゴリ」列を持つ単一の表を作成することです。アプリケーションがDBスキーマを通常の操作の一部として変更しないようにしてください。これは災害のためのレシピです。 – Tomalak