javascript - 为什么删除后打开不调用onupgradeneeded回调

标签 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>

提前致谢

最佳答案

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

如果你这样做,它就会起作用。注意关闭数据库的 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 事件被触发

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

关于javascript - 为什么删除后打开不调用onupgradeneeded回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26733542/

相关文章:

javascript - 复合唯一索引

javascript - Service worker 'sync' 事件在 IOS 上不起作用,如何将离线数据存储到 indexedDB 中?

javascript - 在js中用多个定界符和特殊字符分割

javascript - curry 和空参数

javascript - react 路由器问题

javascript - 将数据传递到 JavaScript-Promise

javascript - 在javascript中定义和声明变量有什么区别吗?

javascript - Textarea onfocus,使用 javascript 模糊

javascript - 有没有使用 Angular.js 和 Indexed DB 的好方法?

javascript - localForage 使用 WebSQL web IndexedDB 可用