--- title: ExtendableEvent slug: Web/API/ExtendableEvent tags: - API - ExtendableEvent - Interface - Offline - Reference - Service Workers - ServiceWorker - Workers translation_of: Web/API/ExtendableEvent ---
ExtendableEvent インターフェイスは、サービスワーカーのライフサイクルの一部として、グローバルスコープでディスパッチされた install イベントと activate イベントの存続期間を延長します。 これにより、データベーススキーマがアップグレードされて古いキャッシュエントリが削除されるまで、機能イベント({{domxref("FetchEvent")}} など)が送出されなくなります。
{{domxref("ExtendableEvent.waitUntil","waitUntil()")}} が ExtendableEvent ハンドラーの外で呼び出された場合、ブラウザーは InvalidStateError をスローする必要があります。 また、複数の呼び出しが積み重なり、その結果の Promise が存続期間延長 Promise(extend lifetime promises)のリストに追加されることにも注意してください。
注: 上記の段落で説明した振る舞いは、Firefox 43 で修正されました({{bug(1180274)}} を参照)。
このインターフェイスは、{{domxref("Event")}} インターフェイスを継承しています。
{{InheritanceDiagram(700, 60, 20)}}
注: このインターフェイスは、グローバルスコープが {{domxref("ServiceWorkerGlobalScope")}} の場合にのみ使用できます。 {{domxref("Window")}} または別の種類のワーカーのスコープの場合は使用できません。
ExtendableEvent オブジェクトを作成します。特定のプロパティを実装していませんが、親である {{domxref("Event")}} からプロパティを継承しています。
親である {{domxref("Event")}} からメソッドを継承しています。
イベントの存続期間を延長します。 これは、インストール中({{domxref("ServiceWorkerRegistration.installing", "installing")}})のワーカーの install {{event("Event_handlers", "event handler")}} と、アクティブ({{domxref("ServiceWorkerRegistration.active", "active")}})ワーカーの activate {{event("Event_handlers", "event handler")}} で呼び出されることを目的としています。
このコードスニペットは、サービスワーカーのプリフェッチの例からのものです(プリフェッチの例をライブで見る)。 コードは {{domxref("ServiceWorkerGlobalScope.oninstall")}} で {{domxref("ExtendableEvent.waitUntil()")}} を呼び出し、インストール中({{domxref("ServiceWorkerRegistration.installing")}})のワーカーがインストール済み(installed)として扱われるのを、渡された Promise が正常に解決されるまで遅らせます。 Promise は、すべてのリソースがフェッチされてキャッシュされたとき、または例外が発生したときに解決します。
コードスニペットは、サービスワーカーが使用するキャッシュのバージョン管理のベストプラクティスも示しています。 この例ではキャッシュは1つしかありませんが、同じアプローチを複数のキャッシュに使用できます。 キャッシュの一括指定識別子を特定のバージョン管理されたキャッシュ名にマップします。
注: Chrome では、ログ文は、chrome://serviceworker-internals を介してアクセスされる関連サービスワーカーの "Inspect" インターフェイスを介して表示されます。
var CACHE_VERSION = 1;
var CURRENT_CACHES = {
prefetch: 'prefetch-cache-v' + CACHE_VERSION
};
self.addEventListener('install', function(event) {
var urlsToPrefetch = [
'./static/pre_fetched.txt',
'./static/pre_fetched.html',
'https://www.chromium.org/_/rsrc/1302286216006/config/customLogo.gif'
];
console.log('install イベントの処理。 プリフェッチするリソース:', urlsToPrefetch);
event.waitUntil(
caches.open(CURRENT_CACHES['prefetch']).then(function(cache) {
return cache.addAll(urlsToPrefetch.map(function(urlToPrefetch) {
return new Request(urlToPrefetch, {mode: 'no-cors'});
})).then(function() {
console.log('すべてのリソースをフェッチし、キャッシュしました。');
});
}).catch(function(error) {
console.error('プリフェッチに失敗:', error);
})
);
});
{mode: 'no-cors'} を使用することが非常に重要です。 この例では、www.chromium.org は CORS をサポートしていません。| 仕様 | 状態 | コメント |
|---|---|---|
| {{SpecName('Service Workers', '#extendableevent', 'ExtendableEvent')}} | {{Spec2('Service Workers')}} | 初期定義 |
{{Compat("api.ExtendableEvent")}}