首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从indexedDB获取对象存储?

如何从indexedDB获取对象存储?
EN

Stack Overflow用户
提问于 2012-08-10 16:56:49
回答 2查看 11.3K关注 0票数 2

我的应用程序上有用于web存储的indexedDb。

我想从下面的代码中获得商店。

var store = myapp.indexedDB.db.transaction(['tree_nodes'],'readwrite').objectStore('tree_nodes');

它返回错误。我以打开indexeddb数据库和版本更改而闻名。

错误是

Uncaught TypeError: Cannot call method 'transaction' of null

我用断点试过了。在这种情况下,它工作得很好,没有错误。

我怎样才能找到那家商店?请帮帮我。

提前感谢!

EN

Stack Overflow用户

发布于 2013-05-05 05:31:40

错误可能是因为您的db变量为空。这几乎总是因为您试图将db存储在一个全局变量中作为回调的结果,然后在一个单独的函数中访问db变量,该函数不能保证只在设置了db变量之后才执行,这样浏览器就会发现您正在访问一个未初始化的变量。

解决方案很简单(但令人沮丧)。您不能以这种方式使用全局变量,除非您想了解某些库对promises和延迟对象的实现。相反,看看Deni给出的答案。使用回调并在回调函数中编写代码,而不是全局变量。“‘db”只能从回调request.onsuccess函数中访问,并且不是全局的。这就是为什么Deni的能行得通。他的代码将仅在保证被初始化(非空)时才尝试访问db。

因为你没有发布你周围的代码,这是很重要的,你需要这样做:

// I am an evil global variable that will not work as expected
myapp.indexedDB.db = 'DO NOT USE ME OR YOU WILL GET AN ERROR';

// I am a good function that only accesses an initialized db variable
function doit() {
    var request = window.indexedDB.open(......);
    request.onsuccess = function(event) {
        // Use this db variable, not your global one
        var db = event.target.result;

            // Note that you can also access the db variable using other means
        // here like this.result or request.result, but I like to use event.target
        // for clarity.

        // Now work with the db variable
        var store = db.transaction(['tree_nodes'],'readwrite').objectStore('tree_nodes');
        // do some more stuff with store....
    };
}
票数 7
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11898375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档