Nie ma zbyt wielu przykładów wykazujących IndexedDB w ServiceWorker jeszcze, ale te, które widziałam były skonstruowane tak:Dostęp do indexedDB w ServiceWorker. Sytuacja wyścigu
const request = indexedDB.open('myDB', 1);
var db;
request.onupgradeneeded = ...
request.onsuccess = function() {
db = this.result; // Average 8ms
};
self.onfetch = function(e)
{
const requestURL = new URL(e.request.url),
path = requestURL.pathname;
if(path === '/test')
{
const response = new Promise(function(resolve)
{
console.log(performance.now(), typeof db); // Average 15ms
db.transaction('cache').objectStore('cache').get('test').onsuccess = function()
{
resolve(new Response(this.result, { headers: { 'content-type':'text/plain' } }));
}
});
e.respondWith(response);
}
}
Czy to może zawieść, gdy ServiceWorker uruchamia się, a jeśli tak to jakie to jest solidny sposób dostępu do indexedDB w ServiceWorker?
Teoretyczny. Kod działa poprawnie, ale tylko dlatego, że zdarzenie onsuccess zawsze "wygrywa". Promisingifying indexedDB jest prawdopodobnie właściwym rozwiązaniem. – Adria
Jeśli nie korzystasz z transakcji i po prostu korzystasz z IndexedDB jak localStorage, coś takiego jak ten, z którym się łączyłem, wydaje się działać wystarczająco dobrze. –
To prawda, ale to naprawdę ogranicza zastosowania IndexedDB - tracisz możliwość grupowania operacji w transakcje atomowe i jest naprawdę powolna, gdy wszystko jest w swojej własnej transakcji. – dumbmatter