到目前为止,还没有很多示例在ServiceWorker中演示indexedDB,但是我看到的都是这样构造的:
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 );
}
}
当ServiceWorker启动时,这是否有可能失败,如果是的话,在ServiceWorker中访问indexedDB的可靠方法是什么?
最佳答案
每次ServiceWorker启动时打开IDB都不是最佳选择,即使不使用IDB,您最终也会打开它。而是在需要时打开数据库。单例在这里真的很有用(请参阅https://github.com/jakearchibald/svgomg/blob/master/src/js/utils/storage.js#L5),因此,如果IDB在其生命周期中使用过两次,则无需两次打开它。
“激活”事件是打开IDB并允许任何“onupdateneeded”事件运行的好地方,因为ServiceWorker的旧版本已无法使用。
关于html - 在ServiceWorker中访问indexedDB。比赛条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29206836/