Update indexedDb within Ajax returns error: The transaction has finished?
Update indexedDb within Ajax returns error: The transaction has finished?
我正在尝试使用来自 IndexedDb 的数据更新 mysql。
我循环将 IndexedDb 和插入数据扔到 mysql。
当 ajax 调用完成时,循环应该继续。
但是我得到这个错误:
Uncaught DOMException: Failed to execute 'update' on 'IDBCursor': The transaction has finished.
我可以看到 Ajax 调用返回成功并且 mySql 已更新。
但是在更新 IndexDb 时出现 returns 错误。
这是代码:
//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?!这是更好的方法吗?
在开始交易之前执行 ajax 调用。您不能将带有 ajax 的异步调用与 indexedDB 事务混合在一起。 IndexedDB 事务将在检测到事务中没有活动请求后很快自动关闭。
我正在尝试使用来自 IndexedDb 的数据更新 mysql。
我循环将 IndexedDb 和插入数据扔到 mysql。
当 ajax 调用完成时,循环应该继续。
但是我得到这个错误:
Uncaught DOMException: Failed to execute 'update' on 'IDBCursor': The transaction has finished.
我可以看到 Ajax 调用返回成功并且 mySql 已更新。
但是在更新 IndexDb 时出现 returns 错误。
这是代码:
//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?!这是更好的方法吗?
在开始交易之前执行 ajax 调用。您不能将带有 ajax 的异步调用与 indexedDB 事务混合在一起。 IndexedDB 事务将在检测到事务中没有活动请求后很快自动关闭。