IndexedDB:承诺升级?

2024-03-04

刚刚开始我的第一个项目 IndexedDb,我很难尝试创建一个在第一次使用时打开和升级数据库的系统。我想使用承诺(当前角Js$q https://code.angularjs.org/1.2.22/docs/api/ng/service/%24q服务,但我很灵活)给我一些关于捕获发生的错误的保证,并减少推理故障模式的精神开销。我的要求是:

  • 消费者调用一些函数来打开和升级返回承诺的数据库
  • 该功能按顺序执行所有必要的升级/迁移。如果没有发生错误,则通过连接到数据库来解决承诺
  • 如果任何阶段发生任何错误,则 Promise 一定会因错误而被拒绝
  • 添加新的迁移/升级步骤就像定义执行升级的函数一样简单,所有其他并发问题都由“框架”处理。

到目前为止我遇到的问题:

  • The onupgraderequired如果数据库不需要升级,则不会调用回调(因此,如果数据库不需要升级,则在升级完成时得到解决的承诺将永远不会得到解决,并且调用代码不知道在以下情况下是否会出现这种情况连接回调)
  • 如果一项升级依赖于另一项升级(例如填充您刚刚创建的商店),则必须等到其升级onsuccess调用回调 - 因此每次升级都需要顺序链接
  • 看起来,在链中的前一个解决之后执行的承诺的延迟足以在再次需要之前将“交易”标记为不活动(我认为它们是用“nextTick”安排的,这可能是相同的机制从而使交易无效)。
  • update如果一个升级依赖于另一个升级,那么到onsuccess第一个回调被调用,versionchange交易不再活跃。

我目前的结论是,API 从根本上反对基于承诺的方法。我最好的尝试如下(为了便于阅读而进行了一些简化)。我哪里错了?

var newPromise = function(withDeferred) {
    var deferred = $q.defer();
    try {
        withDeferred(deferred);
    } catch (err) {
        deferred.reject(err); 
    }
    return deferred.promise;
};

var newTransactionPromise = function(getTransaction) {
    return newPromise(function(deferred) {
        var transaction = getTransaction();

        transaction.oncomplete = function(ev) { deferred.resolve(); };
        transaction.onabort = function(ev) { deferred.reject(transaction.error); };
    });
};

var migrations = [
    function(db) {
        return newTransactionPromise(function() {
            // throws: The database is not running a version change transaction.
            return db
                .createObjectStore("entries", { keyPath: 'id', autoIncrement: true })
                .transaction;
        });
    },
    function(db) {
        return newTransactionPromise(function()
        {
            var entryStore = db.transaction("entries", "readwrite").objectStore("entries");
            entryStore.add({ description: "First task" });
            return entryStore.transaction;
        });
    }
];

var upgradeAndOpen = function() {
    return newPromise(function(deferred) {
        var latest_version = migrations.length;
        var request = indexedDB.open("caesium", latest_version);

        request.onupgradeneeded = function(event) {
            try {
                // create an already resolved promise to start a chain
                var setupDeferred = $q.defer(); 
                setupDeferred.resolve();
                var setupComplete = setupDeferred.promise;

                for (var v = event.oldVersion; v < latest_version; v++)
                {
                    // Problem: the versionchange transaction will be 'inactive' before this promise is scheduled
                    var nextMigration = migrations[v].bind(this, request.result);
                    setupComplete = setupComplete.then(nextMigration);
                }

                setupComplete["catch"](deferred.reject);
            } catch (err) {
                deferred.reject(err);
            }
        };

        request.onerror = function(event) { deferred.reject(request.error); };
        request.onsuccess = function(event) { deferred.resolve(request.result); };
    });
};

upgradeAndOpen()["catch"](function(err) { $scope.status = err; });

var open = function(name, ver) {
  return new Promise(function(yes, no) {
     var req = indexedDB.open(name, var);
     req.onupgradedneeded = function(res) {
       no(req);
       req.onsuccess = null; // for clarity
     };
     req.onsuccess = function() {
       yes(res.result);
     };
     req.onblocked = no;
  }
});

open('db name', 3).then(function(db) {
  // use db here

 }, function(req) {
   // version upgrade logic here

   if (req instanceof IDBResult) {
    return new Promise(function(yes, no) {
      req.transaction.createObjectStore('store_3');
      req.onsuccess = function() {
        yes(req.result);
      });
    });
  }
});
       
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IndexedDB:承诺升级? 的相关文章

随机推荐

  • 如何在 Sphinx 文档中将成员注释为抽象?

    以下两个属性定义在 Sphinx 中显示完全相同autodocHTML 输出 property def concrete self This is the concrete docstring pass abstractproperty d
  • cURL NTLM 代理授权

    我已经使用curl有一段时间了 它工作正常 但是使用用户 域 用户名 来验证curl的代理无法请求授权 授权方式为NTLM 该代码位于批处理文件中 Code curl proxy ntlm proxy user proxy PROXY UR
  • 在定义函数之前调用函数(前向引用扩展了变量的定义)

    考虑这个基本的 Scala 示例代码 object Test def main args Array String inner var x Int 5 def inner println x x 尝试编译它会产生以下错误消息 test sc
  • Access 中的 ConcatRelated(),使用两个键

    我找到了 ConcatRelated 函数 http allenbrowne com func concat html 它似乎做了我想要的事情 但我需要输入两个键而不是一个 我的数据如下所示 Chain Store Warehouse Wa
  • 从相机捕获的iphone图像自动旋转Swift

    通过编程方式 我在应用程序中从相机捕获了图像 它已经很好地获取了 但是当我转移到另一个时 查看并忽略那个视图 当时我的图像我想旋转为风景 我用相机拍摄了图像 当我从照片库获取图像时 没有发现问题 下图是我的原图 截屏 https i sta
  • 如何将数据从一个 BigTable 表复制到另一个 BigTable 表

    我正在尝试将数据从一个 Bigtable 表复制到另一个 Bigtable 表 但没有找到任何直接的方法来执行此操作 可以选择将数据从 Bigtable 表复制到 Google Storage 然后从存储文件复制回 Bigtable 但这需
  • API方法排序:Swagger版本3.0.2

    我在用招摇版本3 0 2 http swagger io swagger ui 我也关注了这个答案 https stackoverflow com a 32345035 3006390但对方法顺序没有影响 window onload fun
  • 在 Spark 数据框中创建 StructType 的空列

    我需要将 StructType 的空列添加到现有的 DataFrame 中 尝试以下 df df withColumn features typedLit StructType Nil And df df withColumn featur
  • 对表单集中的每个表单进行重复查询

    在我的 Django 应用程序中 我的用户可以拥有多个职位 即 Position 模型有 User 模型的外键 通过使用 djangomodelformset factory我输出与当前登录用户关联的所有位置 如下所示 视图 py clas
  • 单步执行属性/函数 (F11) 无法按预期工作

    In Visual Studio 2010 the Step Into Property Function F11 doesn t work as expected 它不会进入属性设置器或获取器 我将解决方案转换为Visual Studio
  • 如何在 React App 中嵌入 Google 自定义搜索?

    我需要在 React 应用程序中嵌入 JS 小部件 有办法做到吗 JS 小部件是 Google 自定义搜索 function var cx 111 xxx var gcse document createElement script gcs
  • 在开发与生产版本中自动更改 Vite 代理位置?

    在我正在开发的单页应用程序中 我正在使用 Vite 并在我的vite config ts文件我有以下代理 proxy v1 target https 127 0 0 1 8080 changeOrigin true secure false
  • updatepanel中异步回发后如何在客户端推迟更新

    我有一个旧系统 它使用UpdatePanelsASP NET 的 之后postback完成后 我们知道里面UpdatePanel已更新 我可以在客户端以某种方式延迟此更新吗 那可能吗 所以就像 当postback启动后 我设置了一个java
  • MSMQ 与临时表转储

    我知道这个问题之前已经被问过 但环顾四周 我还是拿不定主意该走哪条路 以下是我的情况 希望对你有帮助 我们将提供一系列网络服务 数百个移动应用程序将按计划访问这些服务 这些服务将在设备上提供数据 并将新信息发送到设备并从设备返回 从设备返回
  • jQuery:从triggerHandler()接收额外参数

    span test span change function e console log e data triggerHandler change foobar 1 是我做错了还是有问题 谢谢 额外的数据作为参数传递给处理程序 span t
  • CoreNLP SemanticGraph - 搜索具有特定引理的边

    我正在使用斯坦福 CoreNLP 的依存解析器 并且想知道如何使用特定的头引理 从属引理和词汇关系对 SemanticEdge 进行通用搜索 例如 如果我有这样的实际依赖项 doobj 发现 4 见解 6 如何使用引理而不是字面单词和索引来
  • 如何将基于权重的累积趋势线添加到 R 的直方图中?

    在下面的直方图中添加累积趋势线时遇到了一些严重的问题 与我能找到的所有示例的主要区别在于 x 轴应该是距离的区间 但 y 轴是每个 bin 的 tonne km 总和 我为此使用重量 累积密度曲线应包括重量 吨 公里 为此随机生成一些数据
  • 在 ViewHolder 模式中将 ViewHolder 设置为静态对性能至关重要吗?

    将 ViewHolder 设置为静态对性能至关重要吗 ViewHolder模式 http developer android com training improving layouts smooth scrolling html View
  • 将一个函数绑定到kivy中的多个动态创建的按钮?

    Problem 我想创建多个按钮并将它们绑定到一个函数 问题是 每当我单击一个按钮时 该函数就会被多次调用 看来是事件连接的问题 当我查看按下按钮时调用该函数的实例时 似乎该函数立即从每个按钮调用 KV Code This is the b
  • IndexedDB:承诺升级?

    刚刚开始我的第一个项目 IndexedDb 我很难尝试创建一个在第一次使用时打开和升级数据库的系统 我想使用承诺 当前角Js q https code angularjs org 1 2 22 docs api ng service 24q