サービスワーカーから定期的にAPIを呼び出して、localStorageに保存されているデータを送信したいと思います。このデータは、ユーザーが私のウェブサイトを閲覧したときに生成され、localStorageに保存されます。統計をlocalStorageに保存し、Service Workerを介して定期的に送信することを検討してください。どうすればよいですか? Service WorkerからlocalStorageにアクセスできず、postMessage APIを使用する必要があることを理解しています。任意の助けをいただければ幸いです。
WebworkerプロセスからlocalStorage(およびsessionStorage)にアクセスすることはできません。それらの結果はundefined
になりますが、これはセキュリティ上の理由からです。
postMessage()
を使用してワーカーの元のコードに戻り、そのコードでデータをlocalStorageに保存する必要があります。
ローカルストレージからデータを保存および取得するには、localStorage.setItem()
およびlocalStorage.getItem()
を使用する必要があります。
より詳しい情報:
以下の擬似コードは、それがあなたを始めることを願っています:
// include your worker
var myWorker = new Worker('YourWorker.js'),
data,
changeData = function() {
// save data to local storage
localStorage.setItem('data', (new Date).getTime().toString());
// get data from local storage
data = localStorage.getItem('data');
sendToWorker();
},
sendToWorker = function() {
// send data to your worker
myWorker.postMessage({
data: data
});
};
setInterval(changeData, 1000)
https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers は言う
注:localStorageはService Workerキャッシュと同様に機能しますが、同期的であるため、Service Workerでは許可されていません。
注:必要に応じて、IndexedDBをService Worker内でデータストレージに使用できます。
また、ここで少し議論があります: angularでService Workerを使用してローカルストレージにアクセスするにはどうすればよいですか?
私はlocalforage
というこのパッケージを使用しています。これは、IndexedDBをラップするlocalStorageのようなインターフェースを提供します。 https://github.com/localForage/localForage
次に、それをパブリックディレクトリに配置することでインポートできます。これにより、Webサーバーによってサービスが提供され、サービスワーカー内でself.importScripts('localforage.js');
が呼び出されます。