在 AJAX 中更新indexedDb返回错误:交易是否已完成?[重复]

zvokhttg  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(155)

此问题在此处已有答案

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?!这是一个更好的方法吗?

kqlmhetl

kqlmhetl1#

在启动事务之前执行 AJAX 调用。您不能将异步调用与ajax和indexedDB事务混合在一起。indexedDB事务会在检测到事务中没有活动请求后很快自动关闭。

相关问题