是否有服务工作者启动waitUntil来延迟处理提取?

Ale*_*ant 3 asynchronous indexeddb service-worker progressive-web-apps

是否有可能让服务工作者等待开始处理获取事件,直到异步工作在服务工作者启动时完成?

我有一个app shell,其中包含在数据中定义的路由.要在服务工作者启动时安装特定的路由获取处理程序,我需要从IndexedDB(异步)查找路由数据.

不幸的是,服务工作者在IndexedDB查找完成之前开始接受获取事件,并设置路由的获取处理.

现在,我只是硬编码一个特殊情况的默认处理程序,但是让服务工作者只是延迟处理获取事件,直到在服务工作者启动时完成IndexedDB处理.

我没有看到"waitUntil"的方法,也许我错过了?

owe*_*ncm 6

一个代码片段会有所帮助,因为我不是100%清楚这个问题...但是做了一些猜测:

在您通过侦听安装事件解析为event.waitUntil提供的承诺之前,SW不应该拦截任何网络请求,因此在那里设置IDB应该没问题.

一般情况下,让fetch事件监听器运行并且不做任何事情也很好,因为在这种情况下浏览器将像往常一样回退到网络.

一般来说,值得记住的是,SWs可以并且确实经常被杀死,因此局部变量不会在接收不同事件之间留下来.如果处理不同事件时需要一些数据,则应将其保存在IDB或Cache API中,然后再从中获取.


Sal*_*lva 5

有一个解决方法:

function startupAsyncStuff() {
  return new Promise(function (fulfill, reject) {
    // put here your async stuff and fulfill the promise when done.
  });
}

// Launch your startup async code
var asyncStuffDone = startupAsyncStuff();

// On fetch, wait for the former promise to be resolved first
self.onfetch = function (event) {
  event.respondWith(asyncStuffDone.then(function () {
    // your fetch handling code
  }));
};
Run Code Online (Sandbox Code Playgroud)