Не удалось получить доступ к indexeddb от сервисного работника

Я сохранил данные в 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");
 }
 }

person Ravikrn    schedule 22.12.2015    source источник


Ответы (1)


Если я возьму ваш код за пределы прослушивателя событий 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 в своей реализации.

person Jeff Posnick    schedule 22.12.2015