【问题标题】:Error while entering data into database in IndexedDb在 IndexedDb 中将数据输入数据库时​​出错
【发布时间】:2019-08-21 02:35:39
【问题描述】:

当我尝试插入数据时,出现以下错误:

“未捕获的 DOMException:无法在 'IDBObjectStore' 上执行 'put': 交易已完成。”

我的代码:


request.onsuccess = function(e) {
  var ip="kaka";
  var res;
  console.log("success");
  db = request.result;
  tx = db.transaction("List","readwrite");
  store = tx.objectStore("List");
  index = store.index("Name");

  displayData(function oncompleted(value) {
    console.log('The value is', value);
    store.put({
      Name: $('#card').val(), IP: value
    });            
  });
}

function displayData(myCallbackFunction) {
  //code
  myCallbackFunction(set);
}

【问题讨论】:

  • 存储前需要序列化数据。使用JSON.stringify,例如JSON.stringify({Name: 'val-1', IP: 'val-2'})
  • 如果我尝试在 displayData "it works" 之外执行相同的 "store.put" 命令,但在这种情况下我将无法使用回调值@Raymond

标签: javascript indexeddb


【解决方案1】:

该错误意味着您的交易在您调用store.put 之前已经完成。在 IndexedDB 中,transactions commit automatically:

事务与事件循环密切相关。如果您进行事务并返回事件循环而不使用它,则事务将变为非活动状态。保持事务活跃的唯一方法是对其发出请求。当请求完成时,您将收到一个 DOM 事件,并且假设请求成功,您将有另一个机会在回调期间扩展事务。如果您返回事件循环而不扩展事务,那么它将变为非活动状态,依此类推。只要有待处理的请求,事务就会保持活动状态。事务生命周期非常简单,但可能需要一点时间来适应。再举几个例子也会有所帮助。如果您开始看到 TRANSACTION_INACTIVE_ERR 错误代码,那么您就搞砸了。

基本上这意味着,您不能执行其他不相关的异步操作,然后对事务发出请求。

查看您的代码,这应该不是问题,因为displayData 同步调用myCallbackFunction。我猜您发布的代码只是一个简化的示例,并不是产生错误的真实代码。在您的真实代码中,displayData 可能正在异步执行其回调。

【讨论】:

  • 好答案,正是我的想法
猜你喜欢
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
相关资源
最近更新 更多