ExtendableEvent - Web APIs 编辑
The ExtendableEvent
interface extends the lifetime of the install
and activate
events dispatched on the global scope as part of the service worker lifecycle. This ensures that any functional events (like FetchEvent
) are not dispatched until it upgrades database schemas and deletes the outdated cache entries.
If waitUntil()
is called outside of the ExtendableEvent
handler, the browser should throw an InvalidStateError
; note also that multiple calls will stack up, and the resulting promises will be added to the list of extend lifetime promises.
Note: The behaviour described in the above paragraph was fixed in Firefox 43 (see bug 1180274.)
This interface inherits from the Event
interface.
<div id="interfaceDiagram" style="display: inline-block; position: relative; width: 100%; padding-bottom: 8.571428571428571%; vertical-align: middle; overflow: hidden;"><svg style="display: inline-block; position: absolute; top: 0; left: 0;" viewbox="-20 0 700 60" preserveAspectRatio="xMinYMin meet"><a xlink:href="https://developer.mozilla.org/wiki/en-US/docs/Web/API/Event" target="_top"><rect x="1" y="1" width="75" height="50" fill="#fff" stroke="#D4DDE4" stroke-width="2px" /><text x="38.5" y="30" font-size="12px" font-family="Consolas,Monaco,Andale Mono,monospace" fill="#4D4E53" text-anchor="middle" alignment-baseline="middle">Event</text></a><polyline points="76,25 86,20 86,30 76,25" stroke="#D4DDE4" fill="none"/><line x1="86" y1="25" x2="116" y2="25" stroke="#D4DDE4"/><a xlink:href="/wiki/en-US/docs/Web/API/ExtendableEvent" target="_top"><rect x="116" y="1" width="150" height="50" fill="#F4F7F8" stroke="#D4DDE4" stroke-width="2px" /><text x="191" y="30" font-size="12px" font-family="Consolas,Monaco,Andale Mono,monospace" fill="#4D4E53" text-anchor="middle" alignment-baseline="middle">ExtendableEvent</text></a></svg></div>
a:hover text { fill: #0095DD; pointer-events: all;}
Note: This interface is only available when the global scope is a ServiceWorkerGlobalScope
. It is not available when it is a Window
, or the scope of another kind of worker.
Constructor
ExtendableEvent()
- Creates a new
ExtendableEvent
object.
Properties
Doesn't implement any specific properties, but inherits properties from its parent, Event
.
Methods
Inherits methods from its parent, Event
.
ExtendableEvent.waitUntil()
Extends the lifetime of the event. It is intended to be called in the
install
EventHandler
for theinstalling
worker and on theactivate
EventHandler
for theactive
worker.
Examples
This code snippet is from the service worker prefetch sample (see prefetch example live.) The code calls ExtendableEvent.waitUntil()
in ServiceWorkerGlobalScope.oninstall
, delaying treating the ServiceWorkerRegistration.installing
worker as installed until the passed promise resolves successfully. The promise resolves when all resources have been fetched and cached, or else when any exception occurs.
The code snippet also shows a best practice for versioning caches used by the service worker. Though there's only one cache in this example, the same approach can be used for multiple caches. It maps a shorthand identifier for a cache to a specific, versioned cache name.
Note: In Chrome, logging statements are visible via the "Inspect" interface for the relevant service worker accessed via chrome://serviceworker-internals.
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.wenjiangs.com/wp-content/uploads/2020/mozilla/customLogo.png'
];
console.log('Handling install event. Resources to pre-fetch:', 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('All resources have been fetched and cached.');
});
}).catch(function(error) {
console.error('Pre-fetching failed:', error);
})
);
});
Important: When fetching resources, it's very important to use {mode: 'no-cors'}
if there is any chance that the resources are served off of a server that doesn't support CORS. In this example, www.chromium.org doesn't support CORS.Specifications
Specification | Status | Comment |
---|---|---|
Service Workers The definition of 'ExtendableEvent' in that specification. | Working Draft | Initial definition. |
Browser compatibility
BCD tables only load in the browser
See also
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论