我有一个使用workbox.backgroundSync.Queue的服务人员。它代理网络请求,保存未传输的请求,以便稍后重播。
下面的代码很危险,因为skipWaiting()将杀死先前的SW,可能会中断其onSync()调用并丢失数据。
self.addEventListener("activate", () => {
self.clients.claim();
});
self.addEventListener("install", () => {
self.skipWaiting();
});
只有软件v1
知道何时准备终止软件v1
。这不是“刷新页面”用户操作-用户不知道并且可能会出错,所以我们为什么要打扰他们。这不是缓存功能。
可能最愚蠢的事情是等待onSync()
完成。这也可能会丢失数据,但可能性要小得多。
self.addEventListener("install", () => {
setTimeout(() => {
self.skipWaiting();
}, 10 * 60 * 1000); // wait 10 minutes for previous SW to complete.
});
如何v1
完成后,让SW v2
进行“包装”并让skipWaiting()
呼叫v1
?
我是否遗漏了某些东西? skipWaiting()
似乎倒退-v2
在做出选择时仅v1
没有信息。我想这样做:
// This code is in the v1 service worker,
// It is called on v1 when v2's "install" event is fired
self.addEventListener('prepare-to-die', event => {
event.waitUntil(
// Stop or wait for onSync() to finished
// Once complete implies v2 should skipWaiting()
// If this fumbles a reject, use current life-cycle
);
});
如何在当前规范中做到这一点?