Ajax IndexedDB删除当前成功全部上传

我昨天发布了类似的内容,但是它起作用了,但是只删除了数据中的最后一个对象。

此ajax上传将处理大量数据,因此我正在使用indexeddb。这也将在手机上使用。因此,我希望它一次上传一个项目,如果一个项目未能从数据中删除之前的项目,那么它们就不需要再次上传所有内容。

我已经尝试过async = false,这完全符合我的需要,但是这个冰柜浏览器。

试图注释掉可能造成混淆的任何位,当前,这仅在完成后才删除最后一项。

function uploadData(e) {

//Get Database

var transaction = db.transaction(["data"], "readonly");

var objectStore = transaction.objectStore("data");

var cursor = objectStore.openCursor();

//Starts Looping

cursor.onsuccess = function(e) {

var res = e.target.result;

if (res) {

if (navigator.onLine) {

$('.popup-heading').text('Uploading...');

var passData = {

client_id: res.value.client_id,

parent_id: res.value.parent_id,

storename: res.value.storename,

image: res.value.image,

key: res.key,

};

var jsonData = JSON.stringify(passData);

$.ajax({

url: "{{ path('destination_app_ajax') }}",

type: "post",

// Works but freezes browser

/*async, flase*/

data: {

"json": passData

},

success: function(JsonData) {

//Delete item once successfull

var t = db.transaction(["data"], "readwrite");

var request = t.objectStore("data").delete(passData.key);

t.oncomplete = function(event) {

console.log('item deleted');

};

},

error: function() {

$('.popup-heading').text('Upload Failed!');

}

});

} else {

$('.popup-heading').text('Please find spaner signal or wifi connection');

}

res.

continue ();

}

}

}

回答:

听起来您有范围问题passData。在循环内部,但在定义之前,请var passData = ...尝试使用匿名函数包装代码块:

(function() {

/* Your code here */

}());

那应该防止passData泄漏到全局范围内,这似乎就是为什么您的IDB代码仅在最后一个循环中起作用的原因。(passData每次AJAX响应完成之前都会重新定义。)

:没有循环,您正在处理回调。我看到的情况是,您正在重新定义onsuccess每个Ajax请求的处理程序(并覆盖除最后一个值之外的所有值),并重用同一事务。尝试将此事务代码移到AJAX请求的成功回调中:

//Get Database 

var transaction = db.transaction(["data"], "readonly");

var objectStore = transaction.objectStore("data");

var cursor = objectStore.openCursor();

这将创建一个关闭并delete在每个响应上提交您的事务。这意味着每个AJAX请求一个事务,每个AJAX请求一个onsuccess回调(不重新定义)。

以上是 Ajax IndexedDB删除当前成功全部上传 的全部内容, 来源链接: utcz.com/qa/401018.html

回到顶部