我正试图用indexedDB更新我的简单应用程序中的一个条目,但是我得到的是 在'IDBObjectStore'上执行'put'失败。事务已经完成。
我似乎想不通为什么它不能完成事务,我试过调试器,它停在这一行。var updateNameRequest = tasksStore.put( requestForItem.result.name, Number(requestForItem.result.id))
请看我下面的代码段 对于额外的上下文,创建、读取和删除工作都很好,只是在更新数据时我遇到了问题。
我也试着实现我从Mozilla那里得到的openCursor技术,我把它注释了出来,因为它也不工作(我得到了同样的行为)。看看我的repo,我知道它还是很乱的 :(
const request = window.indexedDB.open("toDoList", 2);
var db;
request.onsuccess = function (event) {
console.log("check out some data about our opened db: ", request.result);
db = event.target.result; // result of opening the indexedDB instance "toDoList"
getTasks(); //just a function to retrieve data
};
$(document).on("click", ".editBtn", function () {
var transaction = db.transaction("tasks", "readwrite");
var tasksStore = transaction.objectStore("tasks");
console.log(tasksStore);
let taskId = $(this).attr("idNo");
var requestForItem = tasksStore.get(Number(taskId));
requestForItem.onsuccess = function () {
// console.log(requestForItem.result)
var oldData = requestForItem.result;
// prepopulate the input
$(".editInput").val(requestForItem.result.name);
$(".saveBtn").click(function () {
requestForItem.result.name = $(".editInput").val().trim()
console.log( requestForItem.result)
var updateNameRequest = tasksStore.put( requestForItem.result.name, Number(requestForItem.result.id))
console.log("-------------", updateNameRequest.transaction) // doesn't get to this line
updateNameRequest.onerror = function() {
console.log("something went wrong")
console.log(updateNameRequest.error)
};
updateNameRequest.onsuccess = function() {
console.log("here")
$(".editInput").val("")
getTasks();
};
});
};
当所有的请求都已完成,并且在控制返回到事件循环之前没有进一步的请求时,索引DB事务会自动提交。换一种方式--你可以在前一个请求的成功或错误回调中提出新的请求,但不能在其他异步回调中(如事件处理程序)。
你需要在点击处理程序中启动一个新的事务,因为之前的任何事务都会自动提交。