此问题在此处已有答案:
Async operations inside indexeddb cursor(1个答案)
去年关闭了。
我正在尝试使用IndexedDb中数据更新mysql
我循环把IndexedDb和inset数据扔到mysql中。
当 AJAX 调用完成时,循环应该继续。
但我得到这个错误:
未捕获的DOM异常:无法在“IDBCcursor”上执行“update”:交易已完成。
我可以看到 AJAX 调用返回了成功,并且mySql已更新。
但当更新IndexDb时,它返回错误。
这是代码:
//UPDATE/SYNC INDEXEDDB WITH MYSQL
function update_mysql(){
//UPDATE INFO TEXT
$('#info_text').text('Öppnar IndexedDb..');
//OPEN CONNECTION TO INDEXEDDB
var transaction = db.transaction(["Orderlist"], "readwrite");
var objectStore = transaction.objectStore('Orderlist');
//FETCH DATA FROM INDEXEDDB
objectStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
//UPDATE INFO TEXT
$('#info_text').text('Loopar igenom IndexedDb..');
//IF STATUS = 1, SYNC/UPDATE
if (cursor.value.status == "1") {
var order_id = cursor.value.id;
var sum_received = cursor.value.sum_received;
//UPDATE INFO TEXT
$('#info_text').text('Ansluter till databasen..');
//SEND DATA TO PHP
$.ajax({
url: 'php/update_mysql_orderlist.php',
method: 'post',
dataType: 'json',
data: {order_id: order_id, sum_received: sum_received},
success: function(result){
//UPDATE INFO TEXT
$('#info_text').text('Order med id: '+order_id+' updaterad i mySql');
},
complete: function(){
//UPDATE INDEXDB STATUS
var updateData = cursor.value;
updateData.status = "2";
var request = cursor.update(updateData);
//REQUST SUCCESS
request.onsuccess = function() {
console.log('Order with id: '+order_id+' is now updated with IndexedDb!');
};
//CONTINUE LOOP
cursor.continue();
}
});
}
//IF STATUS != 1
else{
//CONTINUE LOOP
cursor.continue();
}
}
else {
//LOOP IS DONE!
console.log('Update/sync completed!');
}
};
};
更好的解决方案?
我应该先从IndexedDb获取数据并保存到数组,然后用 AJAX 只做一个事务?然后更新IndexedDb?!这是一个更好的方法吗?
1条答案
按热度按时间kqlmhetl1#
在启动事务之前执行 AJAX 调用。您不能将异步调用与ajax和indexedDB事务混合在一起。indexedDB事务会在检测到事务中没有活动请求后很快自动关闭。