ExtendableEvent

这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。

作为 service worker 生命周期的一部分,ExtendableEvent接口延长了在全局范围上installactivate事件的生命周期。这样可以确保在升级数据库架构并删除过时的caches之前,不会调度任何函数事件(如FetchEvent)。
如果在ExtendableEvent处理程序之外调用waitUntil(),浏览器应该抛出一个InvalidStateError;还要注意,多个调用将堆积起来,结果promises 将添加到extend lifetime promises.
 

提示: 上述段落中描述的行为在firefox 43中得到了修复(参见 bug 1189644 )。

此接口继承自Event接口。

提示: 只有当全局范围是 ServiceWorkerGlobalScope 时,此接口才可用。当它是一个 Window 或其他类型 worker 的作用域时,它不可用。

构造函数

ExtendableEvent()
创建新的ExtendableEvent对象。

特性

不实现任何特定属性,但从其父级事件继承属,Event

方法

从他的父辈继承, Event.

ExtendableEvent.waitUntil()

延长事件的生存期。它将在service worker 的 installactivate 事件中被调用。

实例

代码片段来自service worker prefetch sample (查看 prefetch example live.)。代码在ServiceWorkerGlobalScope.oninstall中调用ExtendableEvent.waitUntil(),延迟将ServiceWorkerRegistration.installing Worker视为已安装,直到传递的promise resolve(在所有资源都已被提取和缓存的情况,或者发生任何异常时的问题.)

代码段还显示了对service worker使用的缓存进行版本控制的最佳实践。虽然在这个例子中只有一个缓存,但是相同的方法可以用于多个缓存。它将缓存的速记标识符映射到特定的、版本化的缓存名称。

提示:在chrome中,日志记录语句通过chrome://service worker 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('Handling install event. Resources to pre-fetch:', urlsToPrefetch);

  event.waitUntil(
    caches.open(CURRENT_CACHES['prefetch']).then(function(cache) {
      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);
    })
  );
});
重点: 在获取资源时,如果有可能资源是由不支持 CORS 的服务器提供的,那么使用 {mode: 'no-cors'} 非常重要。在本例中, www.chromium.org 不支持CORS。

Specifications

Specification Status Comment
Service Workers
ExtendableEvent
Working Draft Initial definition.

Browser compatibility

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!
Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 40.0 44.0 (44.0)[1] 未实现 24 未实现
async waitUntil() ? 53.0 (53.0)[2] 未实现 ? 未实现
Feature Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support 未实现 44.0 (44.0) 未实现 ? 未实现 40.0
async waitUntil() 未实现 53.0 (53.0)[2] 未实现 ? 未实现 ?

[1] Service workers (and Push) have been disabled in the Firefox 45 & 52 Extended Support Releases (ESR.)

[2] ExtendableEvent.waitUntil() can now be called asynchronously (see bug 1263304).

See also