在 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 记录创建和删除会发生什么。删除后对象是否重新创建?