为什么在删除后打开并不会调用onupgradeneeded回调

时间:2014-11-04 11:03:56

标签: javascript indexeddb

我正在使用带有最新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>

提前致谢

2 个答案:

答案 0 :(得分:2)

删除第二次没有工作,因为数据库是打开的,因此&#34;被阻止&#34;处理程序被调用。

如果你这样做就行了。注意关闭db的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.dbNamethis是您上下文中的窗口。如果你也改了它:

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 - &gt;如果未找到数据库,则认为这些步骤成功。中止这些步骤

答案 1 :(得分:0)

好的,它与indexedDB无关。 在我的例子中,this.dbName是未定义的。我应该使用那个代替。 抱歉错误。

但是,我不承认为什么deleteDabase(undefined)不会抛出错误...