ServiceWorkerGlobalScope
========================

ServiceWorker API (en-US) 的`ServiceWorkerGlobalScope` 接口，代表一个 service worker 的全局执行上下文。

开发者应该知道，ServiceWorker 的状态在结束/重启的循环中不是一直保持不变的，所以每个事件处理器应该设定一个默认的全局状态。

一旦成功地注册了 service worker，为了节省内存和处理器，它将在他的状态达到了空闲的时候被终止。一个在激活状态的 service worker 为了响应事件是可以自动重启的，就像这两个方法， `ServiceWorkerGlobalScope.onfetch` 或者`ServiceWorkerGlobalScope.onmessage` (en-US).

此外，在 service worker 中，同步请求是被禁止的 - 只有异步请求，如方法`fetch()` 才被允许。

该接口继承自 `WorkerGlobalScope` (en-US) 接口，以及其父类 `EventTarget`, 因此继承属性来自 `WindowTimers`, `WindowBase64`.

属性
--

`ServiceWorkerGlobalScope.clients` (en-US) 只读 

Contains the `Clients` object associated with the service worker.

`ServiceWorkerGlobalScope.registration` (en-US) 只读 

Contains the `ServiceWorkerRegistration` (en-US) object that represents the service worker's registration.

`ServiceWorkerGlobalScope.caches` 只读 

Contains the `CacheStorage` object associated with the service worker.

事件
--

`activate` (en-US)

Occurs when a `ServiceWorkerRegistration` (en-US) acquires a new `ServiceWorkerRegistration.active` (en-US) worker.

`contentdelete` (en-US) 
实验性

Occurs when an item is removed from the `Content Index` (en-US).

`fetch` (en-US)

Occurs when a `fetch()` is called.

`install` (en-US)

Occurs when a `ServiceWorkerRegistration` (en-US) acquires a new `ServiceWorkerRegistration.installing` (en-US) worker.

`message` (en-US)

Occurs when incoming messages are received. Controlled pages can use the `MessagePort.postMessage()` (en-US) method to send messages to service workers. The service worker can optionally send a response back via the `MessagePort` exposed in `event.data.port`, corresponding to the controlled page.

`notificationclick` (en-US)

Occurs when a user clicks on a displayed notification.

`notificationclose` (en-US)

Occurs when a user closes a displayed notification.

`sync` (en-US)

Triggered when a call to `SyncManager.register` (en-US) is made from a service worker client page. The attempt to sync is made either immediately if the network is available or as soon as the network becomes available.

`periodicsync` (en-US) 
实验性

Occurs at periodic intervals, which were specified when registering a `PeriodicSyncManager` (en-US).

`push` (en-US)

Occurs when a server push notification is received.

`pushsubscriptionchange` (en-US)

Occurs when a push subscription has been invalidated, or is about to be invalidated (e.g. when a push service sets an expiration time).

方法
--

`ServiceWorkerGlobalScope.skipWaiting()`

Allows the current service worker registration to progress from waiting to active state while service worker clients are using it.

`ServiceWorkerGlobalScope` implements `WorkerGlobalScope` (en-US) — which implements `GlobalFetch`. Therefore it also has the following property available to it:

`GlobalFetch.fetch()`

Starts the process of fetching a resource. This returns a promise that resolves to the `Response` object representing the response to your request. This algorithm is the entry point for the fetch handling handed to the service worker context.

示例
--

This code snippet is from the service worker prefetch sample (see prefetch example live.) The `ServiceWorkerGlobalScope.onfetch` event handler listens for the `fetch` event. When fired, the code returns a promise that resolves to the first matching request in the `Cache` object. If no match is found, the code fetches a response from the network.

The code also handles exceptions thrown from the `fetch()` operation. Note that an HTTP error response (e.g., 404) will not trigger an exception. It will return a normal response object that has the appropriate error code set.


```js
self.addEventListener("fetch", function (event) {
  console.log("Handling fetch event for", event.request.url);

  event.respondWith(
    caches.match(event.request).then(function (response) {
      if (response) {
        console.log("Found response in cache:", response);

        return response;
      }
      console.log("No response found in cache. About to fetch from network...");

      return fetch(event.request).then(
        function (response) {
          console.log("Response from network is:", response);

          return response;
        },
        function (error) {
          console.error("Fetching failed:", error);

          throw error;
        },
      );
    }),
  );
});
```

规范
--

| Specification |
| --- |
| Service Workers # serviceworkerglobalscope-interface |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* 使用 Service Worker
* Service worker 基本代码示例
* 是否支持 ServiceWorker
* `Promise`
* 使用 web worker