При удалении записи из 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.
Любая помощь оценила, что я делаю неправильно.