IndexedDB没有回调

时间:2014-10-01 17:17:32

标签: javascript jquery macos safari indexeddb

我有一个用JavaScript编写的插件,用于创建/连接到IDB,检查商店内的数据并在必要时填充,然后返回请求的数据。该插件在Chrome / FF中运行良好,但似乎不想在Safari 7.1中运行。

我目前遇到的问题是,当我在iOS设备上创建数据库时,我没有得到成功或错误函数的回调,而且当我在Mac上的Safari上创建数据库时,我得到一个空白错误回来。

这是代码的片段,它位于名为database的插件内的函数内。 var dbName = string和var dbVersion = 1

 database = {
    init: function(callback){
      //TEMP FOR DEBUG  - DELETE DB IF EXISTS
      window.indexedDB.deleteDatabase(dbName);
      //Now create & init
      var req = window.indexedDB.open(dbName,dbVersion);  
      console.debug('DBName/Version',dbName,dbVersion);
      req.onabort = function(event){
        console.error('Aborted!',event.target,req);
      }
      req.onerror = function(event){
        console.error('DB Init',event.target);
      }
      req.onblocked = function(event){
        console.error('Blocked',event);
        alert("Please close other tabs with this website open!");
        return;
      };

      req.onsuccess = function(event){
        //Will be called after upgrade if that is called
        console.info('success called');
        db = req.result;
        console.debug(db);
        dbOpen = true;
        //Check Object Stores Are Correct
        var obs = db.objectStoreNames;
        if((!!(typeof callback == 'function')))
          callback.call();
      };
      req.onupgradeneeded = database.upgrade;
      console.debug('Did something happen?',req);
    },

在open()函数之后,我有一个控制台调试,它打印提供给open& amp;在所有回调之后的最后,我有一个调试打印出“发生了什么事”。以及请求。

在Safari for Mac上运行该功能时,它会将其打印到控制台中: https://www.dropbox.com/s/vrshdjhzazg2ixo/Screenshot%202014-10-01%2018.11.01.png?dl=0

当在iOS上运行并且在Mac上打开web检查器时,甚至没有产生错误,只是似乎跳过了所有内容 - 输出与上面的图像相同,但没有产生控制台错误。

然而,最奇怪的是即使在Mac上的Safari上产生错误,当我刷新页面时,有一个数据库显示在资源窗格中,尽管其中没有商店; https://www.dropbox.com/s/fqg4tbqp1vzffp1/Screenshot%202014-10-01%2018.14.08.png?dl=0

如果有人可以分享一些经验或伸出援助之手,我会很感激这一点 - 一直试图将其破解数小时并将其推向弯道 - 特别是因为它适用于所有其他浏览器!

非常感谢, 杰登

2 个答案:

答案 0 :(得分:0)

https://developer.mozilla.org/en-US/docs/Web/API/IDBFactory.deleteDatabase

在这里查看文档之后 - 我得出结论,deleteDB最有可能在打开后被调用。无论哪种方式,我已经重构了代码,以便在成功后现在调用删除后运行init,现在这已经解决了问题!

答案 1 :(得分:0)

为什么不等待onsuccess方法的deleteDatabase回调?