2017-08-29 1 views
1

Ich habe ein Szenario, in dem ich brauche postmessage der neuesten Version Dateien Array von Client Service Arbeiter auf dem Update-Servicefall Arbeiter zu senden.Wie warte ich auf das Ereignis "Nachricht" innerhalb des Ereignisses "Installation" in Service Worker?

aktuellen Code

reg.onupdatefound = function() { 
     // The updatefound event implies that reg.installing is set; see 
     // https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event 
     var installingWorker = reg.installing; 

     console.log('on update found'); 

     // service worker is updated with version name eesh 
     if(reg.installing) 
     { 
      reg.installing.postMessage({ 
      data: cacheUrls() 
      }); 
     } 


     installingWorker.onstatechange = function() { 
      switch (installingWorker.state) { 
      case 'installed': 
       if (navigator.serviceWorker.controller) { 
       // At this point, the old content will have been purged and the fresh content will 
       // have been added to the cache. 
       // It's the perfect time to display a "New content is available; please refresh." 
       // message in the page's interface. 
       console.log('New or updated content is available. yo yo'); 
       // navigator.serviceWorker.controller.postMessage({data: location}) 
       } else { 
       // At this point, everything has been precached. 
       // It's the perfect time to display a "Content is cached for offline use." message. 
       console.log('ServiceWorker registration successful with scope: ', reg.scope); 

       } 
       break; 

      case 'redundant': 
       console.error('The installing service worker became redundant.'); 
       break; 
      } 
     }; 
     }; 
}; 

Aber manchmal ist die Installation geschieht zuerst und dann „Nachricht“ Ereignis wird im Servicemitarbeiter zugehört. Wie warte ich auf "Nachricht" -Ereignis im "Install" -Ereignis des Service-Arbeiters?

Antwort

1

Ich glaube, Sie so etwas tun kann:

// sw.js 

self.addEventListener('install', function(e) { 
    const installPromise = new Promise(function(resolve, reject) { 
     // do install stuff, like caching resources, etc. 

     self.addEventListener('message', function(e) { 
      // 1. do something with the received data 
      // 2. remove this event listener 
      resolve(); 
     }); 
    }); 

    e.waitUntil(installPromise); 
}); 

e.waitUntil() nimmt ein Promise so wir es eine geben. Die install Phase wird erst beendet, wenn das Versprechen e.waitUntil() Entschlüssen übergeben. Wir lösen nur Promise auf, sobald wir die Nachricht vom Client erhalten haben.

Verwandte Themen