未能在“IDBObjectStore”上执行“放置”:事务已完成

Posted

技术标签:

【中文标题】未能在“IDBObjectStore”上执行“放置”:事务已完成【英文标题】:Failed to execute 'put' on 'IDBObjectStore': The transaction has finished 【发布时间】:2020-08-01 09:48:13 【问题描述】:

我正在尝试使用 indexedDB 更新我的简单操作应用程序中的条目,但是我得到 Failed to perform 'put' on 'IDBObjectStore':事务已完成。

我似乎无法弄清楚为什么它不能完成事务,我尝试了调试器,它停在这一行:var updateNameRequest = tasksStore.put( requestForItem.result.name, Number(requestForItem.result.id)) 请参阅下面我包含的 sn-p。对于其他上下文创建、读取和删除工作,它只是更新我遇到问题的数据

我还尝试实现我从 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();
      ;
    );
  ;

【问题讨论】:

这能回答你的问题吗? Async operations inside indexeddb cursor 【参考方案1】:

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

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

【讨论】:

天哪,你让我头疼不已!!非常感谢我刚刚编辑了它,现在我的代码正在运行。 Alexa 播放 Sweet Victory

以上是关于未能在“IDBObjectStore”上执行“放置”:事务已完成的主要内容,如果未能解决你的问题,请参考以下文章

TransactionInactiveError:无法在“IDBObjectStore”上执行“添加”:事务未处于活动状态

未捕获的 DOMException:无法在“IDBObjectStore”上执行“删除”:事务未处于活动状态

未能执行数据表搜索

Replace Child 给出错误(未能在节点上执行“replacechild”)?

TeamCity 代理错误“未能对代理执行结帐”

未能执行目标 maven-antrun-plugin - GitHub 操作上的连接超时