无法从服务工作者访问indexeddb

时间:2015-12-22 13:02:14

标签: indexeddb service-worker

我已经将数据存储在indexeddb中,我试图在服务工作者中访问此数据。但是没有完成打开indexeddb的请求,它正在等待。因此,我无法访问数据。在解决问题方面需要帮助。以下是我从服务工作者访问数据的代码。

var idbSupported = false;
var db;
self.addEventListener('push', function(){
 if("indexedDB" in self) {
     idbSupported = true;
  }else{ console.log('Indexed db not supported');}
  if(idbSupported) {
     var openRequest = indexedDB.open("test",1);
     openRequest.onupgradeneeded = function(e) {
        console.log("Upgrading...");
        var thisDB = e.target.result;
        if(!thisDB.objectStoreNames.contains("users")) {
            thisDB.createObjectStore("users", { autoIncrement: true });
        }
    } 
    openRequest.onsuccess = function(e) {
        console.log("Success!");
        db = e.target.result;
        readUser();
    }
    openRequest.onerror = function(e) {
        console.log("Error");
        console.dir(e);
    }
  }
},false);

 function readUser(){
  var transaction = db.transaction(["users"], "readwrite");
  var store = transaction.objectStore("users");
  var request = store.get(user_id);
  request.onerror = function() {
  console.log("Error");

 }
request.onsuccess = function() {
 console.log("Yolo! Did it");
 }
 }

1 个答案:

答案 0 :(得分:4)

如果我将代码带到push事件侦听器之外,并且只是在服务工作者中无条件地运行它,它就会成功运行。我并不完全确定导致您所看到的内容的原因,但push事件可能并未按照您的预期触发?

如果您正在寻找一些显示在服务工作者中使用IndexedDB的一般代码,https://github.com/GoogleChrome/samples/blob/gh-pages/service-worker/offline-analytics/service-worker.js是一个可能有用的示例。但我认为您发布的代码基本上可行。

顺便说一句,没有必要检查服务工作者中是否'indexedDB' in self。 IndexedDB在Chrome和Firefox的服务工作者实现中都可用,并且我非常假设将来运送服务工作者的任何其他浏览器也会在其实现中公开IndexedDB。