10

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 にアクセスする堅牢な方法は何ですか?

4

3 に答える 3

11

ServiceWorker が起動するたびに IDB を開くのは最適ではない可能性が高く、使用されていない場合でも IDB を開くことになります。代わりに、必要なときにデータベースを開きます。ここではシングルトンが非常に便利です ( https://github.com/jakearchibald/svgomg/blob/master/src/js/utils/storage.js#L5を参照)。生涯で2回。

古いバージョンの ServiceWorker は邪魔にならないので、「activate」イベントは IDB を開いて「onupdateneeded」イベントを実行させるのに最適な場所です。

于 2015-03-25T16:24:08.083 に答える
4

制御されたページを介して IndexedDB にアクセスすることにより、Service Worker のコンテキストから IndexedDB にアクセスすることについて、特別なことは何も知りません。

Promises を使用すると明らかに Service Worker 内での作業がはるかに簡単になるため、生の IndexedDB API の代わりにhttps://gist.github.com/inexorabletash/c8069c042b734519680cのようなものを使用すると便利であることがわかりました。ただし、非同期の IndexedDB 操作の状態を反映する独自の promise を作成および管理する限り、必須ではありません。

イベント ハンドラーを作成する際に留意すべき主な点fetch(これは IndexedDB を使用する場合に限ったことではありません) は、 を呼び出す場合、オブジェクトまたはオブジェクトで解決される promiseevent.respondWith()を渡す必要があるということです。それを行っている限り、あなたがIndexedDB エントリから構築されているか、キャッシュ API から構築されているか、または他の場所から構築されているかは問題ではありません。ResponseResponseResponse

投稿したコードで実際に問題が発生していますか、それとも理論上の問題でしたか?

于 2015-03-23T20:49:31.923 に答える