新的Edge Indexeddb错误的解决方法?

时间:2018-03-15 00:20:36

标签: javascript performance microsoft-edge indexeddb

微软在过去几天发布了更新kb4088776,这对indexedDb openCursor的性能造成了破坏性影响。

这里简单的小提琴显示了问题。通过更新,“检索”时间为40秒或更长。在更新之前,它大概是1秒钟。

https://jsfiddle.net/L7q55ad6/23/

相关的检索部分在这里:

var _currentVer = 1;
function _openDatabase(fnSuccess) {
    var _custDb = window.indexedDB.open("MyDatabase", _currentVer);

    _custDb.onsuccess = function (event) {
        var db = event.target.result;
        fnSuccess(db);
    }
    _custDb.onerror = function (event) {
        _custDb = null;
        fnSuccess(null); // should use localData
    }
    _custDb.onupgradeneeded = function (event) {
        var db = event.target.result;
        var txn = event.target.transaction;

        // Create an objectStore for this database
        if (event.oldVersion < _currentVer) {
            var customer = db.createObjectStore("customer", { keyPath: "guid" });
            var index = customer.createIndex("by_id", "id", { unique: false });
        }
  };
}


function _retrieveCustomers(fn) {
  _openDatabase(function (db) {
    if (db == null)
    {
      alert("not supported");
      return;
    }
    var customers = [];
    var transaction = db.transaction("customer", "readonly");
    var objectStore = transaction.objectStore("customer");
    if (typeof objectStore.getAll === 'function') {
      console.log("using getAll");
      objectStore.getAll().onsuccess = function (event) {
        fn(event.target.result);
      };
    }
    else {
      console.log("using openCursor");
      objectStore.openCursor().onsuccess = function (event) {
        var cursor = event.target.result;
        if (cursor) {
          customers.push(cursor.value);
          cursor.continue();
        }
        else {
          fn(customers);
        }
      };
    }
  });
}

enter image description here

创建和添加客户的时间基本正常,只有检索不好。 Edge从未支持getAll方法,并且在更新后仍然不支持。

我能想到的唯一解决方法是使用localStorage,但遗憾的是我们的数据集太大而无法满足10MB的限制。现在从我们的服务器检索并将文本转换为javascript对象实际上更快,从而破坏了indexeddb的主要目的。

1 个答案:

答案 0 :(得分:1)

我没有Edge所以我无法对此进行测试,但是它也会在getopenCursor时发生吗?如果get仍然表现良好,您可以在localStorage中存储索引(在您的示例中,主键列表;在您的真实应用中,可能更复杂),然后使用它来调用get每一个。