我正在尝试使用indexedDB更新我的简单应用程序中的条目,但是我无法在'IDBObjectStore'上执行'put':事务已完成。

我似乎无法弄清楚为什么它无法完成交易,我尝试了调试器,它在此行停止:var updateNameRequest = tasksStore.put( requestForItem.result.name, Number(requestForItem.result.id))请参阅下面包含的代码段。对于其他上下文的创建,读取和删除工作而言,它只是很好,它只是更新我遇到问题的数据

我还尝试实现了从Mozilla获得的openCursor技术,我将其注释掉了,因为它也不起作用(我得到了相同的行为)Check out my repo I know it's still very messy :(

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();
      };
    });
  };

最佳答案

当所有请求均已完成且控制未返回事件循环之前,没有其他请求被发出时,索引数据库事务将自动提交。换句话说,您可以在上一个请求的成功或错误回调中发出新请求,但不能在其他异步回调(例如事件处理程序)中发出新请求。

您需要在点击处理程序中启动新的事务,因为任何先前的事务都会自动提交。

10-06 07:48
查看更多