如何在 Service Worker 中持久化数据
How to persist data in a Service Worker
截至目前,Chrome 不支持将附加数据传递给从 GCM 接收的推送通知。因此,每当我收到推送通知时,我都必须从我的 Service Worker 执行 fetch
。到目前为止,还不错。
但是: 我需要在 fetch
中执行的 http 请求中包含一个请求参数。我如何告诉服务人员我的参数?
到目前为止我尝试了什么
使用postMessage
告诉我的Service Worker请求参数:
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)
{
//...
})
);
});
为什么这不起作用
但这不是持久性的,即在我关闭浏览器并再次打开后,我的 serviceWorkerData
丢失了。 localStorage
在 service workers 中不可用,那么我如何在这里获得持久性?
您可以使用 IndexedDB。
https://github.com/mozilla/localForage 如果你想要一个更简单的 IndexedDB 接口。
您可以使用 importScripts 在服务工作者中导入 localForage 库,例如:https://github.com/marco-c/mercurius/blob/master/static/sw-push.js。
截至目前,Chrome 不支持将附加数据传递给从 GCM 接收的推送通知。因此,每当我收到推送通知时,我都必须从我的 Service Worker 执行 fetch
。到目前为止,还不错。
但是: 我需要在 fetch
中执行的 http 请求中包含一个请求参数。我如何告诉服务人员我的参数?
到目前为止我尝试了什么
使用postMessage
告诉我的Service Worker请求参数:
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)
{
//...
})
);
});
为什么这不起作用
但这不是持久性的,即在我关闭浏览器并再次打开后,我的 serviceWorkerData
丢失了。 localStorage
在 service workers 中不可用,那么我如何在这里获得持久性?
您可以使用 IndexedDB。
https://github.com/mozilla/localForage 如果你想要一个更简单的 IndexedDB 接口。
您可以使用 importScripts 在服务工作者中导入 localForage 库,例如:https://github.com/marco-c/mercurius/blob/master/static/sw-push.js。