Таблица не включена в родительскую транзакцию - Dexie - PullRequest
2 голосов
/ 18 марта 2020

Я написал пару функций для манипулирования данными в indexedDB с помощью оболочки Dex ie. Это метод обновления:

updateRow(documentId, rowId, row) {
        this.db.transaction('rw', this.db.tableEntry, async () => {
            await this.db.tableEntry.where({
                documentId: documentId,
                rowId: rowId
            }).modify({row: row})
        }).catch(e => {
            console.log(e)
        });
    }

Эта функция работает отлично, как и ожидалось. Следующая функция реализована таким же образом внутри одного и того же класса:

getAllByDocumentId(documentId, callBack) {
        this.db.transaction('rw', this.db.tableEntry, async () => {
            await this.db.tableEntry.where({
                documentId: documentId,
            }).toArray((entries)=>callBack(entries))
        }).catch(e => {
            console.log(e)
        });
    }

При выполнении этого метода выдается ошибка:

name: "SubTransactionError"
message: "Table tableEntry not included in parent transaction."

Как это исправить? А что за причина ошибки root? 1010 *

1 Ответ

1 голос
/ 18 марта 2020

Я обнаружил, что причина в том, что другие вызывающие классы выполняют несколько функций, которые включают транзакции. Следовательно, эти асинхронные функции перекрывают свои транзакции. По этой причине успешно выполняется только первый вызов функции. Простой подход, который я использовал, заключался в задержке выполнения функции при вызове.

update(...);
setTimeout(getAllByDocumentId(...),200);
setTimeout(otherDBFunction(...),300);

Тогда все работало нормально.

...