【问题标题】:Why opening after deleting doesn't call the onupgradeneeded callback为什么删除后打开不调用onupgradeneeded回调
【发布时间】:2014-11-04 11:03:55
【问题描述】:

我正在使用带有最新 chrome/chromium 版本的 IndexedDB,但我仍然遇到以下问题。 我尝试在创建数据库之前将其删除,如下面的代码所示。

我第一次执行此代码时,'onupgradeneeded' 已正确记录。 此时,DB 存在。 然后,如果您运行相同的代码,数据库会被正确删除,但不会再次调用 onupgradeneeded 回调。

我在其他任何地方都没有在规范中找到任何相关信息。所以如果有人知道如何解决这个问题,我很感兴趣。


更新:

<script type="text/javascript">
var module={

    dbName: 'myDB',
    dbVersion: 1,
    dbStores:[{name:'places', keyPath:'id'}],

    /* START :: DEFINE MAINONLINE INTERFACE FUNCTIONS */

    test: function(){
        var that= this;
        this.deleteDB()
        .then(function(e){
            return that.createEmptyDB(e);}
        )
        .catch(function(error){
            that.logError(error);
        });
    },

    logError: function(e){
        console.log('An error occured');
        if (e.target && e.target.errorCode){
            console.log('errorCode = ' + e.target.errorCode);
        }else{
            console.log(e);
        }
    },

    deleteDB: function(){
        return new Promise(function(resolve, reject){
            var deleteDbRequest= indexedDB.deleteDatabase(this.dbName);
            deleteDbRequest.onsuccess= function(e){
                console.log('deleted successfully');
                resolve(e);
            }
            deleteDbRequest.onerror= function(e){
                console.log('error while deleting');
                reject(e);
            }
            deleteDbRequest.onblocked= function(e){
                console.log('blocked, unable to delete');
                reject(e);
            }
        });
    },

    createEmptyDB: function(event){
        var that= this;
        return new Promise(function(resolve, reject){
            var openDbRequest= indexedDB.open(that.dbName, that.dbVersion);
            openDbRequest.onerror= function(e){
                console.log('error');
                reject(e);
            }
            openDbRequest.onblocked=function(e){
                console.log('The open request is blocked');
            }
            openDbRequest.onsuccess= function(e){
                console.log('onsuccess');
                resolve(e);
            }
            openDbRequest.onupgradeneeded= function(e){
                console.log('onupgradeneeded');
            }
        });
    }
}

module.test();

</script>

提前致谢

【问题讨论】:

    标签: javascript indexeddb


    【解决方案1】:

    第二次删除不起作用,因为数据库是打开的,因此调用了“阻塞”处理程序。

    如果你这样做,它会起作用。注意关闭数据库的 onsuccess 函数。

    var delReq = indexedDB.deleteDatabase('myDB');
    delReq.onsuccess= function(e){
        var openReq = indexedDB.open('myDB', 1);
        openReq.onupgradeneeded= function(e){
            console.log('Im called');
        }
        openReq.onsuccess = function() {
            openReq.result.close();
        }
    }
    delReq.onblocked = function() { console.log("blocked",arguments); } 
    

    编辑

    还为 onblocked 事件添加了一些代码。如果您注释掉openReq.result.close() 代码,您将看到blocked 部分

    edit2

    您的 deleteDb 函数不起作用,请注意 this.dbName。 this 是您上下文中的窗口。如果你也改变它:

    deleteDB: function(){
        var that = this;
        return new Promise(function(resolve, reject){
            var deleteDbRequest= indexedDB.deleteDatabase(that.dbName);
            ....
    

    当你执行这段代码时,你会再次看到 onblocked 事件被触发

    edit3 它使删除undefined 数据库成功的规范的一部分:http://www.w3.org/TR/IndexedDB/Overview.html#dfn-steps-for-deleting-a-database --> 如果没有找到数据库,那么这些步骤被认为是成功的。中止这些步骤

    【讨论】:

    • 是的,你是对的。但是很抱歉,我试图让我的代码更易于阅读,最后问题并不是最初的问题 :-/ 。所以我用更好的样本更新了这个主题。尝试多次重新加载文件...
    • 因为你这个变量改变了我的答案:)
    【解决方案2】:

    好的,它与 indexedDB 无关。 就我而言, this.dbName 是未定义的。我应该只使用 that 代替。 抱歉出错了。

    但是,我不明白为什么 deleteDabase(undefined) 不抛出错误...

    【讨论】:

    • 大声笑,刚刚编辑了我的答案,而不是我看到这个......我注意到 this.dbName 有同样的事情
    • 部分规范:w3.org/TR/IndexedDB/… --> 如果没有找到数据库,则认为这些步骤是成功的。中止这些步骤
    • 将其包含在规范中似乎是一个奇怪的决定。我的猜测是 API 设计者希望该方法是幂等的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2023-01-15
    • 2020-05-13
    • 2018-07-31
    • 1970-01-01
    • 2013-05-08
    • 2016-03-29
    相关资源
    最近更新 更多