С IndexedDB я не могу создать вторую транзакцию для моего хранилища объектов (просто список задач), когда я уже создал транзакцию для чтения и отображения данных. Я не получаю сообщение об ошибке в строке, которая пытается создать вторую транзакцию, но ничего не происходит, и код останавливает выполнение.
Эта часть, которая извлекает и отображает мои данные, работает нормально:
var trans;
var ostore;
var db;
var reqdb = window.indexedDB.open("ToDoApp", 2);
reqdb.onupgradeneeded = function (event) {
console.log("running onupgradeneeded");
var myDB = event.target.result;
if (!myDB.objectStoreNames.contains("todos")) {
myDB.createObjectStore("todos", { keyPath: "ToDoTitle" });
}
};
reqdb.onsuccess = function (event) {
db = event.target.result;
trans = db.transaction(["todos"], "readonly");
ostore = trans.objectStore("todos");
var req = ostore.get("TEST IDB 2");
$("#btnSave").click(function () {
UpdateToDo();
});
req.onerror = function (event) {
alert("error");
};
req.onsuccess = function (event) {
$("#ToDoTitle").val(req.result.ToDoTitle);
};
};
Это получает и отображает вещи просто отлично. Но обратите внимание на функцию UpdateToDo (), которая устанавливается с событием onclick, чтобы я мог на самом деле ОБНОВИТЬ свои данные.
function UpdateToDo(event) {
alert("1");
var newtransaction = db.transaction(["todos"], "readwrite");
alert("2");
var newstore = newtransaction.objectStore("todos");
newstore.openCursor().onsuccess = function (event) {
const cursor = event.target.result;
if (cursor) {
if (cursor.value.ToDoTitle == 'TEST IDB 2') {
const updateData = cursor.value;
updateData.ToDoCategory = 1; // hard coding for now
var requpdate = cursor.update(updateData);
requpdate.onsuccess = function () {
console.log('Updated');
};
requpdate.onerror = function () {
console.log('Error');
}
};
cursor.continue();
} else {
console.log('Cursor error.');
}
};
}
Это первое предупреждение срабатывает, а второе - нет. Я предположил, что, поскольку первый обратный вызов, который создал первую транзакцию, был возвращен, эта транзакция была закрыта, но она все еще блокирует мне создание этой транзакции. Если я выполню первую транзакцию ПОЛНОСТЬЮ, вторая транзакция будет создана, и будет запущено второе предупреждение ... тогда я смогу создать курсор и обновить данные.
Я попытался сделать первую транзакцию и хранилище объектов как глобальные переменные, но это тоже не сработало.
Кажется нелепым позволять вам выполнять только одну транзакцию на страницу. Как еще я должен изначально загружать данные, а затем разрешать пользователю обновлять их? Я что-то упустил?