微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IndexedDB - 在升级期间强制中止,但有 Promises

如何解决IndexedDB - 在升级期间强制中止,但有 Promises

我使用了这篇文章IndexedDB: upgrade with promises?

并在此处实现了部分:https://stackoverflow.com/a/25565755/15778635

这适用于我需要的东西。我遇到问题的部分是:

var newMigrationPromise = function (dbname,version,migration) {
    return newPromise(function (deferred) {
        var request = indexedDB.open(dbname,version);

        // NB: caller must ensure upgrade callback always called
        request.onupgradeneeded = function (event) {
            var db = request.result;
            newTransactionPromise(
                function () {
                    var syncUPStore = transaction.objectStore("syncUP");
                    var syncCountRequest = syncUPStore.count();

                    syncCountRequest.oncomplete = function (event) {
                        if (syncCountRequest.result > 0)
                            deferred.reject(syncCountRequest.result + " SyncUp Records exist,database upgrade aborted,keeping at current version.");
                        else {
                            //Good,continue with update
                            migration(db,request.transaction);
                            return request.transaction;
                        }
                    }
                })
                .then(function () { db.close(); })
                .then(deferred.resolve,deferred.reject);
        };

        request.onerror = function (ev) { deferred.reject(request.error); };
    });
};

我有一个 syncUP 对象存储,其中包含需要在用户上线时发送到服务器的数据。在这种特殊情况下,Service Worker 正在安装(因为它们上线并且服务器上发生了更改)并且需要在允许 Service Worker 更新之前知道是否存在 syncUP 记录。如果它们确实存在,则需要中止安装,直到安装为空。

Service Worker 中止工作正常,如果我在 var syncCountRequest = syncUPStore.count(); 所在的位置抛出错误数据库中止升级也可以正常工作。

我的问题: 如何检查“syncUP”对象存储中是否有记录并仍然使用我上面提到的实现?我曾考虑将逻辑移至另一种方法,但我发现我遇到了同样的问题,即不知道如何处理拒绝/解决。我的 Promises 知识还可以,但还不够好,无法自己弄清楚。

解决方法

一个匆忙的例子:

var request = indexedDb.open(...);
request.onupgradeneeded = function(event) {
  if(conditionShouldDoMigrationFromVersionXToNowIsTrue) {
    migrate(event.transaction);
  }
};

function migrate(versionChangeTransaction) {
  var store = versionChangeTransaction.objectStore('x');
  var request = store.getAll();
  request.onsuccess = function(event) {
     var objects = event.target.result;
     for (var object of objects) {
       // do some mutation to the object
       object.x++;
       // write it back
       store.put(object);
     }
  }; 
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。