当我尝试插入数据时,出现以下错误:
“未捕获的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);
}
答案 0 :(得分:2)
该错误表示您的交易已在您的store.put
调用之前完成。在IndexedDB中,transactions commit automatically:
事务与事件循环紧密相关。如果进行事务并不使用事件返回事件循环,则事务将变为非活动状态。使事务保持活动状态的唯一方法是对其进行请求。请求完成后,您将获得一个DOM事件,并假设请求成功,您将有另一个机会在该回调期间扩展事务。如果返回事件循环而不扩展事务,则它将变为非活动状态,依此类推。只要有待处理的请求,事务就保持活动状态。事务生存期确实非常简单,但是可能需要一点时间来习惯。其他一些示例也将有所帮助。如果您开始看到
TRANSACTION_INACTIVE_ERR
错误代码,则说明您搞砸了。
基本上,这意味着您不能执行其他不相关的异步操作,然后对事务进行请求。
看看您的代码,这应该没问题,因为displayData
同步调用myCallbackFunction
。我猜您发布的代码只是一个简化的示例,而不是产生错误的真实代码。在您的真实代码中,displayData
可能异步执行其回调。