3

Pour l'instant, Chrome ne prend pas en charge la transmission de données supplémentaires pour les notifications push de GCM. Je dois donc exécuter un fetch à partir de mon agent de service chaque fois que je reçois une notification push. Jusqu'ici tout va bien.Comment conserver les données dans un service worker

Mais: Je dois inclure un paramètre de requête dans ma requête http exécutée en fetch. Comment puis-je indiquer mon paramètre au technicien de maintenance?

Ce que j'ai essayé jusqu'à présent

En utilisant postMessage pour dire à mon service Worker le paramètre de demande:

var serviceWorkerData = {}; 

self.addEventListener('message', function (evt) 
{ 
    console.log('service worker received', evt.data); 

    serviceWorkerData = evt.data.myData; 
}); 

self.addEventListener('push', function(event) 
{ 
    event.waitUntil 
    (
     fetch("http://my.url", { 
      method: 'post', 
      body: 'myData=' + serviceWorkerData 
     }).then(function(response) 
     { 
      //... 
     }) 
    ); 
}); 

Pourquoi cela ne fonctionne pas

Mais ce n'est pas persistant, c'est à dire après que je ferme mon navigateur et l'ouvre à nouveau, mon serviceWorkerData est perdu. localStorage n'est pas disponible chez les travailleurs de service, alors comment puis-je obtenir la persistance ici?

Répondre

5

Vous pouvez utiliser IndexedDB.

https://github.com/mozilla/localForage si vous souhaitez une interface plus simple pour IndexedDB.

Vous pouvez importer la bibliothèque localForage dans un service worker à l'aide d'importScripts, voir par exemple: https://github.com/marco-c/mercurius/blob/master/static/sw-push.js.

+0

Fonctionne comme un charme, se sent encore un peu mal cependant. –

+0

Qu'est-ce qui ne va pas? – Marco

+0

Abuser IndexedDB pour quelque chose d'aussi facile que mon problème. –