2015-12-22 107 views
4

我已經將數據存儲在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"); 
} 
} 

回答

2

如果我把你的代碼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。