从由Dexie包装的IndexedDB中删除条目时,promise成功处理程序将显示已删除记录的数量(在我的情况下为1),但是在操作完成后在Chrome或Safari中查看数据库时,该条目仍然存在在那里。
该表的主键由三个字符串设置作为复合键。
我尝试过一些更改查询的方式,以不同方式删除条目。但是最后,所有这些导致假装删除了一个条目,但实际上并非如此。
数据库设置:
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文档中找到该示例。
任何帮助都感谢我做错了。
答案 0 :(得分:1)
从理论上讲,如果您在事务中执行此代码,并且您的承诺得到解决后,代码立即引发错误,那么牵引力将被回滚。
但是我宁愿怀疑您的代码中有什么东西再次将对象放回去。
尝试订阅Table.hooks来记录创建和删除操作会发生什么情况。删除后是否再次创建了对象?