到目前为止,还没有很多示例在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/

10-10 05:40