服务人员“准备死亡”和skipWaiting()

时间:2019-12-19 01:10:37

标签: service-worker

我有一个使用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 
  );
});

如何在当前规范中做到这一点?

0 个答案:

没有答案