Dexie Table.delete с составным ключом в Chrome / Safari только делает вид, что удаляет элемент - PullRequest
0 голосов
/ 13 июня 2019

При удалении записи из IndexedDB, обернутой Dexie, обработчик успеха обещания показывает количество удаленных записей (в моем случае это одна), но при просмотре базы данных в 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
                        )}`
                    );
                });
        });

Iне получают никакого сообщения об ошибке, и при этом обещание не отклонено.Он делает вид, что сделал это, но в инструментах разработчика Chrome или Safari его все еще видно.Даже если я прочитаю запись из объекта по коду позже, она снова все равно вернется.Мне интересно, если мне нужно совершить транзакцию как-нибудь?Могу ли я сделать это, смешивая ExtendedPromise (Dexie) с ES6 Promises?Но если так, я нашел пример в документации Dexie.

Любая помощь оценила, что я делаю неправильно.

1 Ответ

1 голос
/ 13 июня 2019

Теоретически, если вы выполняете этот код в транзакции, и ваш код выдает ошибку сразу после того, как ваше обещание разрешается, эта тяга будет откатываться.

Но я бы предпочел, чтобы что-то в вашемКод возвращает объект снова.

Попробуйте, что произойдет, если вы подпишетесь на Table.hooks для регистрации создания и удаления.Создается ли объект снова после удаления?

...