在IndexedDb中将数据输入数据库时​​出错

时间:2019-03-30 08:15:25

标签: javascript indexeddb

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

  

“未捕获的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);
}

1 个答案:

答案 0 :(得分:2)

该错误表示您的交易已在您的store.put调用之前完成。在IndexedDB中,transactions commit automatically

  

事务与事件循环紧密相关。如果进行事务并不使用事件返回事件循环,则事务将变为非活动状态。使事务保持活动状态的唯一方法是对其进行请求。请求完成后,您将获得一个DOM事件,并假设请求成功,您将有另一个机会在该回调期间扩展事务。如果返回事件循环而不扩展事务,则它将变为非活动状态,依此类推。只要有待处理的请求,事务就保持活动状态。事务生存期确实非常简单,但是可能需要一点时间来习惯。其他一些示例也将有所帮助。如果您开始看到TRANSACTION_INACTIVE_ERR错误代码,则说明您搞砸了。

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

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