- From: dfabulich <notifications@github.com>
- Date: Mon, 13 Nov 2017 09:03:28 +0000 (UTC)
- To: w3c/ServiceWorker <ServiceWorker@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/ServiceWorker/issues/1222@github.com>
It's a common use case to pop up a notification to end users when a new Service Worker is waiting, but it's inconvenient to listen for that event.
ServiceWorkerRegistration offers an `onupdatefound` event, but that fires when the new Service Worker is detected and installation has _started_, not when the new Service Worker is fully installed and waiting to take control. In other words, it notifies us when `registration.installing` changes, but not when `registration.waiting` changes.
It's still possible to await a change in `registration.waiting` by attaching a listener to the `onstatechange` event of the `.installing` Service Worker, and to wait for an `.installing` Service Worker by waiting for the `onupdatefound` event of the registration itself, like this:
```js
function listenForWaitingServiceWorker(reg, callback) {
function awaitStateChange() {
reg.installing.addEventListener('statechange', function() {
if (this.state === 'installed') callback(reg);
});
}
if (reg.waiting) return callback(reg);
if (reg.installing) return awaitStateChange();
reg.addEventListener('updatefound', awaitStateChange);
}
```
This function gets its own special quiz in the Udacity "Offline Web Applications" course; it seems like this cow path could be paved.
I propose adding an `onwaiting` event to ServiceWorkerRegistration, and/or a `.waiting` Promise on the ServiceWorkerContainer. I'd love a one-liner like this:
```js
navigator.serviceWorker.waiting().then(alertUser);
```
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/ServiceWorker/issues/1222
Received on Monday, 13 November 2017 09:04:07 UTC