在Chrome / Safari上使用复合键的Dexie Table.delete仅假装删除该项目

时间:2019-06-13 17:18:37

标签: angular dexie

从由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文档中找到该示例。

任何帮助都感谢我做错了。

1 个答案:

答案 0 :(得分:1)

从理论上讲,如果您在事务中执行此代码,并且您的承诺得到解决后,代码立即引发错误,那么牵引力将被回滚。

但是我宁愿怀疑您的代码中有什么东西再次将对象放回去。

尝试订阅Table.hooks来记录创建和删除操作会发生什么情况。删除后是否再次创建了对象?