首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IndexedDB: TransactionInactiveError

IndexedDB: TransactionInactiveError
EN

Stack Overflow用户
提问于 2016-10-28 22:31:47
回答 2查看 1.8K关注 0票数 1

在这一行:

代码语言:javascript
复制
 var request = store.add(obj); 

我知道错误:

TransactionInactiveError:针对当前未激活或已完成的事务发出请求。

只有当我使用AJAX时才会得到错误。如何确保AJAX在事务完成之前完成?我正在尝试将信息从sql数据库加载到对象存储区。当我搜索错误时,我会得到有关事务和异步性质的信息,但是我还没有找到具体的代码解决方案。

我已经研究过回调、承诺和超时(这对我来说像是一个黑客),但我无法让这个异步调用工作。任何帮助都将不胜感激。

代码语言:javascript
复制
var req = indexedDB.open(DB_NAME, DB_VERSION);
req.onsuccess = function () {
        db = this.result;
        var tx = db.transaction('tblFields', 'readwrite');
        var store = tx.objectStore('tblFields');

             $.ajax({
                    type: "POST",
                    url: "Off.aspx/GetFields",
                    data: '{}',
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (response) {
                        var customers = response.d;
                        $(customers).each(function () {
                            var obj = { measureID: this.measureID, measureName: this.measureName, fieldName: this.fieldName };
                            var request = store.add(obj);
                        });
                    },
                    failure: function (response) {
                        alert(response.d);
                    },
                    error: function (response) {
                        alert(response.d);
                    }
                });
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-28 23:59:13

您的成功回调正在异步执行。将事务初始化代码移动到回调中应该可以解决以下问题:

代码语言:javascript
复制
success: function (response) {
    var customers = response.d;
    var tx = db.transaction('tblFields', 'readwrite');
    var store = tx.objectStore('tblFields');
    $(customers).each(function () {
        var obj = { measureID: this.measureID, measureName: this.measureName, fieldName: this.fieldName };
        var request = store.add(obj);
    });
},
票数 3
EN

Stack Overflow用户

发布于 2016-10-29 19:06:25

如果indexedDB没有检测到事务上的任何活动请求,那么它在短时间内就会关闭。当您发出ajax请求时,不会立即得到响应。在发出ajax请求和获得响应之间,idb没有看到使用事务的活动idb请求,因此它关闭了事务。

解决办法很简单。首先执行ajax请求,然后执行idb事务。以下是一些伪代码:

代码语言:javascript
复制
$.ajax({
  success: function(response) {
    var req = indexedDB.open(...);
    req.onsuccess = function(event) {
      var db = event.target.result; // or this.result, or req.result
      var tx = db.transaction(...);
      var store = tx.objectStore(...);
      for(var customer of response.d) {
        var obj = {...};
        store.add(obj);
      }
    };
  }
});

如果您想使用承诺并访问ES6,请执行以下操作:

代码语言:javascript
复制
function dbconnect(name, version, upgrade) {
  return new Promise(function(resolve, reject) {
    var request = indexedDB.open(name, version);
    request.onupgradeneeded = upgrade;
    request.onsuccess = function(event) {
      var db = event.target.result;
      resolve(db);
    };
    request.onerror = function(event) {
      var error = event.target.error;
      reject(error);
    };
    request.onblocked = function(event) {
      console.warn('blocked, not fulfilling promise until unblocked');
    };
  });
}

function ajaxpostrequest(url) {
  return new Promise(function(resolve, reject) {
    $.ajax({
      type: 'post',
      data: '{}',
      contentType: 'application/json; charset=utf-8',
      dataType: 'json',
      url: url,
      success: resolve,
      failure: reject,
      error: reject
    });
  });
}

function addcustomer(db, customer) {
  return new Promise(function(resolve, reject) {
    var tx = db.transaction(...);
    var store = tx.objectStore(...);
    var obj = {measureId: customer.measureId, ...};
    var request = store.add(obj);
    request.onsuccess = function(event) {
      resolve();
    };
    request.onerror = function(event) {
      reject(event.target.error);
    };
  });
}


async function request_then_connect_then_put() {
  try {
    var response = await fetch(url, {method:'post'});
    console.log('fetched url');
    var json = await response.json();
    var customers = json.d;
    console.log('read json object from text of url');
    var db = await dbconnect(...);
    console.log('connected to database', db.name);
    var addpromises = customers.map((customer) => addcustomer(db, customer));
    var result = await Promise.all(addpromises); 
    console.log('stored all customer object things');
  } catch(error) {
    console.debug(error);
  }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40314074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档