在 Chrome/Safari 上使用复合键的 Dexie Table.delete 只会假装删除该项目
Dexie Table.delete with compound key on Chrome/Safari only pretends to remove the item
当从 Dexie 包装的 IndexedDB 中删除条目时,promise 成功处理程序会显示已删除记录的数量(在我的例子中是一个),但在操作后查看 Chrome 或 Safari 中的数据库已完成条目仍然存在。
table有一个主键,由三个字符串组成,设置为复合键。
我尝试了一些更改我的查询以通过不同方式删除条目。但最后都假装删除了一个条目,但实际上并没有。
数据库设置:
constructor() {
super('ConfirmationDatabase');
this.version(ConfirmationDatabaseService.VERSION_ONE).stores({
confirmations: '[frontid+qmnum+manum]',
});
}
删除条目的代码版本 1:
return new Promise((resolve, reject) => {
this.confirmations
.where({
frontid: id.getFrontId(),
qmnum: id.getQmnum(),
manum: id.getManum(),
})
.delete()
.then((result: any) => { // <--- result equals 1
this.confirmations
.where({
frontid: id.getFrontId(),
qmnum: id.getQmnum(),
manum: id.getManum(),
})
.first()
.then((conf) => {
console.log(conf); // this is undefined
});
resolve(true);
})
.catch((error) => reject(error));
});
删除操作后,我立即再次读取该值以进行测试。它不会找到它,但是当函数结束时,该条目仍在数据库中。
也试过这段代码:
删除条目的代码版本 2:
return new Promise((resolve, reject) => {
this.confirmations
.where('[frontid+qmnum+manum]')
.equals([id.getFrontId(), id.getQmnum(), id.getManum()])
.delete()
.then((result: number) => {
if (result === 1) {
resolve(true); // <--- this is reached
} else {
reject(`Confirmation with following key could not be deleted from database: ${id.toString()}`);
}
resolve(true);
})
.catch((error) => {
reject(
`Confirmation with following key could not be deleted from database: ${id.toString()}. Error ${JSON.stringify(
error
)}`
);
});
});
我没有收到任何错误消息,承诺也没有被拒绝。它假装它做到了,但在 Chrome 或 Safari 开发者工具中它仍然可见。即使我稍后通过代码从对象中读取条目,它仍然返回。我想知道我是否需要以某种方式提交交易?我必须将 ExtendedPromise (Dexie) 与 ES6 Promises 混合使用吗?但如果是这样,我在 Dexie 文档中找到了示例。
任何帮助都感谢我做错了什么。
理论上,如果您在事务中执行此代码,并且您的代码在您的 promise 解决后立即抛出错误,那么牵引力将会回滚。
但我宁愿怀疑您的代码中的某些东西又把对象放回去了。
尝试订阅 Table.hooks 记录创建和删除会发生什么。删除后对象是否重新创建?
当从 Dexie 包装的 IndexedDB 中删除条目时,promise 成功处理程序会显示已删除记录的数量(在我的例子中是一个),但在操作后查看 Chrome 或 Safari 中的数据库已完成条目仍然存在。
table有一个主键,由三个字符串组成,设置为复合键。
我尝试了一些更改我的查询以通过不同方式删除条目。但最后都假装删除了一个条目,但实际上并没有。
数据库设置:
constructor() {
super('ConfirmationDatabase');
this.version(ConfirmationDatabaseService.VERSION_ONE).stores({
confirmations: '[frontid+qmnum+manum]',
});
}
删除条目的代码版本 1:
return new Promise((resolve, reject) => {
this.confirmations
.where({
frontid: id.getFrontId(),
qmnum: id.getQmnum(),
manum: id.getManum(),
})
.delete()
.then((result: any) => { // <--- result equals 1
this.confirmations
.where({
frontid: id.getFrontId(),
qmnum: id.getQmnum(),
manum: id.getManum(),
})
.first()
.then((conf) => {
console.log(conf); // this is undefined
});
resolve(true);
})
.catch((error) => reject(error));
});
删除操作后,我立即再次读取该值以进行测试。它不会找到它,但是当函数结束时,该条目仍在数据库中。
也试过这段代码: 删除条目的代码版本 2:
return new Promise((resolve, reject) => {
this.confirmations
.where('[frontid+qmnum+manum]')
.equals([id.getFrontId(), id.getQmnum(), id.getManum()])
.delete()
.then((result: number) => {
if (result === 1) {
resolve(true); // <--- this is reached
} else {
reject(`Confirmation with following key could not be deleted from database: ${id.toString()}`);
}
resolve(true);
})
.catch((error) => {
reject(
`Confirmation with following key could not be deleted from database: ${id.toString()}. Error ${JSON.stringify(
error
)}`
);
});
});
我没有收到任何错误消息,承诺也没有被拒绝。它假装它做到了,但在 Chrome 或 Safari 开发者工具中它仍然可见。即使我稍后通过代码从对象中读取条目,它仍然返回。我想知道我是否需要以某种方式提交交易?我必须将 ExtendedPromise (Dexie) 与 ES6 Promises 混合使用吗?但如果是这样,我在 Dexie 文档中找到了示例。
任何帮助都感谢我做错了什么。
理论上,如果您在事务中执行此代码,并且您的代码在您的 promise 解决后立即抛出错误,那么牵引力将会回滚。
但我宁愿怀疑您的代码中的某些东西又把对象放回去了。
尝试订阅 Table.hooks 记录创建和删除会发生什么。删除后对象是否重新创建?