3

是否可以让服务工作人员等待开始处理 fetch 事件,直到服务工作人员启动时异步工作完成?

我有一个应用程序外壳,其中包含在数据中定义的路由。要在 service worker 启动时安装特定的路由获取处理程序,我需要从 IndexedDB(异步)查找路由数据。

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

目前,我只是为此硬编码一个特殊情况的默认处理程序,但最好让服务工作人员延迟处理获取事件,直到在服务工作人员启动时完成 IndexedDB 处理。

我没有看到为此“等待直到”的方法,也许我错过了?

4

3 回答 3

6

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

在您解决提供给 event.waitUntil 的承诺之前,当您侦听安装事件时,SW 不应拦截任何网络请求,因此在那里进行 IDB 设置应该没问题。

一般来说,让 fetch 事件侦听器运行而不做任何事情也很好,因为在这种情况下浏览器将正常回退到网络。

一般来说,还值得牢记的是 SW 可以而且确实经常被杀死,因此局部变量不会在接收不同事件之间停留。如果在处理不同的事件时需要一些数据,则应将其保存在 IDB 或缓存 API 中并再次从那里获取。

于 2015-12-01T07:03:58.033 回答
3

有一个解决方法:

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
  }));
};
于 2016-01-08T15:42:23.620 回答
0

由于我使用sw-toolbox并在启动时执行设置路由处理程序的异步工作,所以对我来说最好的解决方案是定义一个临时的 sw-toolbox 默认处理程序,直到处理程序准备好响应。

var toolbox = require('sw-toolbox');

var setupPromise = someAsyncHandlerSetup()
.then(function () {
  // make default handler temporary, allows other fetch handlers.
  toolbox.router.default = null;
});

// until the async handler setup is done, provide a default handler
// to avoid an offline-dino flash when starting up while offline. 
toolbox.router.default = function defaultHandler (request) {
  return setupPromise.then(function () {
    var handler = toolbox.router.match(request);
    if (handler) {
      return handler(request);
    }
    throw new Error('default handler could not handle ' + request.url);
  });
};
于 2016-04-01T20:56:00.557 回答