indexedDB openCursor 事务成功返回空数组

2023-12-20

            req = db.openCursor();
            req.customerData=new Array() //[{a:1}]
            req.onsuccess = function(e) {
                var cursor = e.currentTarget.result;
                if (cursor) {
                    //console.log(cursor.value);
                    e.currentTarget.customerData.push(cursor.value);
                    e.currentTarget.customerData.push("hello?");         
                    cursor.continue()
                }
                else {
                    console.log(e.currentTarget.customerData) //this always correct
                }
            }

     console.log(req.customerData); //outside the onsuccess everything is gone?

console.log(req);

当我在 chrome 控制台中打开对象时,我可以看到 customerData

console.log(req.customerData);

但是当我执行上述操作时它是空的?

替换new Array() with [{a:1}]

console.log(req.customerData);

我可以看到a还有其他物体

但话又说回来

console.log(req.customerData[0].a);

作品和其他物品都消失了。

如何保存客户数据?我尝试只推送数字或文本,但交易完成后同样的事情。我无法获取数据,只能在事务期间将其显示在 console.log() 上?

我知道它一定是通过引用传递的,但是我放入的每个变量都消失了?

下面添加了完整的示例,只需在控制台中键入 write() 和 read()

    <script>
        var iDB
        ready=function(){
            var request = indexedDB.open("my-database",1);
            request.onupgradeneeded = function(e) {
                var db = e.currentTarget.result
                var store = db.createObjectStore("store", {keyPath: "muts", autoIncrement:false})
                //store.createIndex("by_submit", "submit", {unique: false})
                console.log('db upgrade', 'v'+db.version)
            }
            request.onerror = function(e) {
                //var db = e.currentTarget.result;
                //db.close()
                console.error('db error ',e)
            }
            request.onsuccess = function(e) {
                var db = e.currentTarget.result
                db.onversionchange = function(e) {
                    db.close()
                    console.log('db changed', 'v'+db.version, 'CLOSED')
                }
                console.log('db setup', 'v'+db.version, 'OK')
            }
            iDB=request
        }

        drop=function(){
            iDB.result.close()
            var req = indexedDB.deleteDatabase(this.iDB.result.name);
            req.onsuccess = function() {console.log("Deleted database successfully")}
            req.onerror = function() {console.log("Couldn't delete database")}
            req.onblocked = function() {console.log("Couldn't delete database due to the operation being blocked")}
        }

        read=function(){
            var db=iDB
                    .result
                    .transaction(["store"], "readwrite").objectStore("store");

            var req = db.openCursor();
            req.iData=new Array();
            req.onsuccess = function(e) {
                var cursor = e.currentTarget.result;
                if (cursor) {
                    e.currentTarget.iData.push(cursor.value);
                    e.currentTarget.iData.push("hello");
                    cursor.continue()
                }
                else {
                    console.log(e.currentTarget.iData)
                }
            }

            console.log(req.iData)

        }

        write=function(){
            var db=document.querySelector('my\-database')
                .iDB
                .result
                .transaction(["store"], "readwrite").objectStore("store");

            var customerData = [
                {muts: "Bill", qty: "1"},
                {muts: "Donna", qty: "1"}
            ]

            for (var i in customerData){db.put(customerData[i])}
        }

        ready()
    </script>

一些东西

  • 我建议不要设置 IDBRequest 对象的自定义属性。相反,创建并访问外部作用域中的对象。
  • 无需使用 event.currentTarget。 event.target 就足够了(“this”也是如此,请求对象本身也是如此)。
  • onversionchange 已弃用。
  • 由于indexedDB的异步特性,您可能会尝试将尚不存在或不再存在的内容打印到控制台。相反,尝试在交易完成时打印一些内容。

例如:

function populateArray(openDatabaseHandle, onCompleteCallbackFunction) {
  var transaction = openDatabaseHandle.transaction('store');
  var store = transaction.objectStore('store');
  var myArray = [];
  var request = store.openCursor();
  request.onsuccess = function() {
    var cursor = this.result;
    if(!cursor) return;
    myArray.push(cursor.value);
    cursor.continue();
  };
  transaction.oncomplete = function() {
    onCompleteCallbackFunction(myArray);
  };
}

// An example of calling the above function
var conn = indexedDB.open(...);
conn.onsuccess = function() {
  populateArray(this.result, onPopulated);
};

// An example of a callback function that can be passed to 
// the populateArray function above
function onPopulated(data) {
  console.debug(data);
  data.forEach(function(obj) {
    console.debug('Object: %o', obj);
  });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

indexedDB openCursor 事务成功返回空数组 的相关文章

随机推荐

  • 在不同集合视图之间拖放单元格

    我在一个屏幕上有多个集合视图 在collectionView One中我有像Square这样的普通单元格 在 collectionView 两个中 我有组单元格 例如相同的单元格 但多个单元格被组的边框包围 我需要在一个集合视图与另一个集合
  • Android 约束布局奇怪的行为

    我的约束布局的版本是1 0 0 alpha8 当我在布局中包含工具栏后 工具栏的左侧和右侧都有空间 如下图所示 这是我的工具栏的代码
  • 多个向量的笛卡尔积

    类似的问题以前曾被问过 但我找不到与我的问题完全匹配的问题 我有 4 个向量 每个向量包含 200 500 个 4 位整数 每个向量中元素的确切数量各不相同 但我可以将其修复为特定值 我需要找到这 4 个向量中元素的所有可能组合 eg v1
  • Boto Ec2 和弹性 IP

    是否可以使用 python boto 将弹性 IP 地址与 ec2 实例关联 我正在尝试自动化部署 我在ec2部分搜索了api文档 但没有找到任何结果 不知道你在看什么文档 但它在那里 http boto readthedocs org e
  • Android Studio中的渲染问题

    我安装了最新版本Android Studio并创建了 hello world 应用程序 但是activity无法在预览窗格中呈现 我安装了所有最新的软件包SDK manager 显示的错误如下 java lang NoSuchFieldEr
  • Travis-CI 找不到相关模块需求

    我有一个正在运行 mocha 测试的 Travis 构建作业 但是构建失败并出现以下错误 Error Cannot find module sources reddit 我的文件树如下 feeds sources Reddit js Fee
  • Ruby:NoMethodError,但为什么呢?

    我在学习 Ruby 时正在开发一个简单的 Pi 生成器 但我在 RubyMine 6 3 3 上不断收到 NoMethodError 所以我决定用尽可能简单的方式创建一个新项目和新类 并且我STILL得到无方法错误 任何原因 class M
  • Android - 需要 ondraw() 视图示例的帮助

    我使用下面的代码来绘制视图 Override protected synchronized void onDraw Canvas canvas super onDraw canvas paint setStyle Style STROKE
  • Android Imageswitcher:定期切换图像?

    我正在使用带有 TouchListener 的 ImageSwitcher 来更改数组中的图像 它工作正常 但我希望它每隔 x 秒左右切换一次图像 以便我可以添加imageSwitcher setImageResource imageLis
  • 在 MS SQL Server 2005 中插入忽略?

    MS SQL Server 2005 中是否有 mysql 的 INSERT IGNORE 等效项或类似的功能 我不熟悉 mysql INSERT IGNORE 功能 但我正在阅读的文档听起来好像它所做的只是忽略 默默地失败 尝试插入表中已
  • Android Camera API - 强制关闭不会释放相机资源[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 因此 在开发自定义相机应用程序时 我在极少数情况下和在各种设备上意识到 如果应用程序必须强制关闭 它并不总是释放相机资源 有没有办法找
  • Django 模型过滤器存储在数据库中

    我正在 feincms 中处理内容类型 我想创建一个可以在数据库中存储过滤器的内容类型 大致看起来是这样的 from news models import Entry class NewsContent models Model filte
  • 无法在 RedHat Enterprise Linux 中使用 WebSphere MQ 8 配置 HermesJMS

    我正在尝试配置HermesJMS v1 14 with WebSphereMQ v8 0 但是我不能 我看过几个教程 并且遵循了它们 尽管没有一个完全是这些版本 这就是我所做的 我已经下载了这个试用版MQ V8 0 Trial for Mu
  • 如何在 Windows 10 上注册 ASP.NET?

    当我运行此命令时 出现以下错误 aspnet regiis exe i C Windows Microsoft NET Framework64 v4 0 30319 gt aspnet regiis exe i Microsoft R AS
  • 错误 ITMS-90432:Swift 支持无效。有解决办法吗?

    尝试将我的应用程序分发到 App Store Connect 时出现错误 这是我第一次遇到这个错误 我已经分发了 8 个不同版本的应用程序 没有出现任何错误 完整错误是 错误 ITMS 90432 Swift 支持无效 文件 APP NAM
  • IE8:选项标签默认获得“selected”属性(而cloneNode把它搞得一团糟)

    IE 似乎会自动在选项标签上添加 选定 属性 但如果你克隆Node它 事情就会变得奇怪 如果你在IE8中打开一个页面 代码如下
  • Cordova 忽略屏幕方向锁定[重复]

    这个问题在这里已经有答案了 我正在使用 Cordova 3 3 0 和我的 Galaxy S3 运行最新的 Cyanogenmod 来测试我正在开发的应用程序 我需要应用程序屏幕保持在 纵向 模式并被锁定 即使用户旋转设备也是如此 无论我尝
  • 为什么我会收到模板函数指针的链接器错误?

    我有一个 EventMgr 类 它有一个模板函数来注册侦听器 但是 当我注册监听器时 链接器给了我一个 错误 LNK2019 无法解析的外部符号 开胃菜代码 class EventMgr template lt class T class
  • 如何导入 .R 文件并为其指定别名?就像 import myfile.R as mf

    R 初学者 真的很想念 Python import pandas as pd import my file which is just a file not a package as mf out mf my cool function 我
  • indexedDB openCursor 事务成功返回空数组

    req db openCursor req customerData new Array a 1 req onsuccess function e var cursor e currentTarget result if cursor co