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

Javascript 新的Edge Indexeddb错误的解决方法?,javascript,performance,microsoft-edge,indexeddb,Javascript,Performance,Microsoft Edge,Indexeddb,微软在过去几天发布了更新kb4088776,这对indexedDb openCursor的性能产生了毁灭性的影响 这里简单的小提琴说明了问题所在。更新后,“检索”时间为40秒或更长。在更新之前,大约是1秒 相关检索部分如下: var _currentVer = 1; function _openDatabase(fnSuccess) { var _custDb = window.indexedDB.open("MyDatabase", _currentVer); _custD

微软在过去几天发布了更新kb4088776,这对indexedDb openCursor的性能产生了毁灭性的影响

这里简单的小提琴说明了问题所在。更新后,“检索”时间为40秒或更长。在更新之前,大约是1秒

相关检索部分如下:

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);
        }
      };
    }
  });
}
var\u currentVer=1;
函数_openDatabase(fnSuccess){
var _custDb=window.indexedDB.open(“MyDatabase”,当前版本);
_custDb.onsuccess=函数(事件){
var db=event.target.result;
成功(db);
}
_custDb.onerror=函数(事件){
_custDb=null;
fnSuccess(null);//应使用localData
}
_custDb.onupgradeneeded=函数(事件){
var db=event.target.result;
var txn=event.target.transaction;
//为此数据库创建objectStore
如果(event.oldVersion<\u currentVer){
var customer=db.createObjectStore(“客户”{keyPath:“guid”});
var index=customer.createIndex(“by_id”,“id”,{unique:false});
}
};
}
功能检索客户(fn){
_openDatabase(函数(db){
if(db==null)
{
警报(“不支持”);
返回;
}
var客户=[];
var事务=数据库事务(“客户”、“只读”);
var objectStore=transaction.objectStore(“客户”);
if(objectStore.getAll的类型=='function'){
log(“使用getAll”);
objectStore.getAll().onsuccess=函数(事件){
fn(事件、目标、结果);
};
}
否则{
log(“使用openCursor”);
objectStore.openCursor().onsuccess=函数(事件){
var cursor=event.target.result;
如果(光标){
customers.push(cursor.value);
cursor.continue();
}
否则{
fn(客户);
}
};
}
});
}

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


我能想到的唯一解决办法是使用本地存储,但不幸的是,我们的数据集太大,无法满足10MB的限制。实际上,现在从我们的服务器检索文本并将文本转换为javascript对象的速度更快了,这违背了indexeddb的主要目的。

我没有Edge,因此无法测试这一点,但它是在
get
中发生的,还是仅仅在
openCursor
中发生的?如果
get
仍然运行良好,您可以在localStorage中存储一个索引(在您的示例中,主键列表;在您的实际应用中,可能更复杂),然后使用该索引对每个索引调用
get

那么,我猜您是在寻求替代解决方案?您应该在edge上填充一个bug。是的,老实说,我们可能不得不采取的解决办法是每次都从我们的服务器下载。get似乎表现正常,至少对人类的敏感度来说是如此,但做10000次可能会被证明同样缓慢。我试图在这里实现这一点,但我没有耐心等待它完成。即使在Chrome中,速度也太慢:我认为一次排队的操作太多了,试试看——至少在我的电脑上,性能是合理的(Firefox快一点,Chrome慢一点),这是有希望的。在Edge中,它甚至比更新前的版本更快。当然,我在真实数据中有稀疏键,但我会看看我是否能做到这一点,可能会像你说的那样在localstorage中保存一个列表。在非更新版本上,它稍微快一点。我已经安装了更新,弄不清楚我的计算机处于哪个状态。在某些情况下,这是个不错的把戏,但不幸的是,这对我没有帮助。