Solución:
No puede acceder a localStorage (y también a sessionStorage) desde un proceso de webworker, el resultado será undefined
, Esto es por razones de seguridad.
Necesitas usar postMessage()
volver al código de origen del trabajador y hacer que ese código almacene los datos en localStorage.
Deberías usar localStorage.setItem()
y localStorage.getItem()
para guardar y obtener datos del almacenamiento local.
Más información:
Worker.postMessage ()
Window.localStorage
Pseudo código a continuación, con la esperanza de que le ayude a empezar:
// 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)
He estado usando este paquete llamado localforage
que proporciona una interfaz similar a localStorage que envuelve IndexedDB. https://github.com/localForage/localForage
Luego puede importarlo colocándolo en su directorio público, para que sea servido por su servidor web, y luego llamando a: self.importScripts('localforage.js');
dentro de su trabajador de servicio.
https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers dice
Nota: localStorage funciona de manera similar a la caché del trabajador del servicio, pero es sincrónico, por lo que no está permitido en los trabajadores del servicio.
Nota: IndexedDB se puede utilizar dentro de un trabajador de servicios para el almacenamiento de datos si lo necesita.
También hay un poco de discusión aquí: ¿Cómo accedo al almacenamiento local usando trabajadores de servicio en angular?