IndexedDB -升级期间强制中止,但带有承诺

cbeh67ev  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(189)

我用这个帖子: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记录是否存在。如果存在,则需要中止安装,直到安装为空。
如果我在var syncCountRequest = syncUPStore.count();的位置抛出错误,service worker abort工作正常,数据库aborting upgrade工作正常。
我的问题:我如何检查“syncUP”对象存储中是否有记录,并仍然使用我上面提到的实现?我曾考虑过将逻辑移到另一个方法,但我发现我也有同样的问题,不知道如何处理拒绝/解析。我的承诺知识是可以的,但还不够好,不能靠我自己解决这个问题。

raogr8fs

raogr8fs1#

一个仓促的例子:

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);
     }
  }; 
}

相关问题