有Service Worker启动waitUntil延迟处理fetch吗?
Is there a Service Worker startup waitUntil to delay processing fetch?
是否可以让 Service Worker 等待异步工作在 Service Worker 启动时完成才开始处理获取事件?
我有一个应用 shell,其路由在数据中定义。要在服务工作者启动时安装特定的路由获取处理程序,我需要从 IndexedDB(异步)查找路由数据。
不幸的是,在 IndexedDB 查找可以完成并为路由设置提取处理之前,服务工作者开始接受提取事件。
目前,我只是为此硬编码了一个特殊情况的默认处理程序,但最好让服务工作者延迟处理获取事件,直到 IndexedDB 处理在服务工作者启动时完成。
我没有找到 "waitUntil" 的方法,也许我错过了?
代码片段会有所帮助,因为我对这个问题不是 100% 清楚...但是做一些猜测:
除非您在侦听安装事件时解决提供给 event.waitUntil 的承诺,否则 SW 不应拦截任何网络请求,因此在那里设置 IDB 应该没问题。
一般来说,只使用获取事件侦听器 运行 并且不执行任何操作也很好,因为在这种情况下浏览器会正常回退到网络。
总的来说,还值得牢记的是,SW 可以而且确实会经常被杀死,因此局部变量不会在接收不同事件之间停留。如果在处理不同的事件时需要一些数据,您应该将其保存在 IDB 或缓存中 API 并再次从那里获取。
有一个解决方法:
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
}));
};
由于我使用 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);
});
};
是否可以让 Service Worker 等待异步工作在 Service Worker 启动时完成才开始处理获取事件?
我有一个应用 shell,其路由在数据中定义。要在服务工作者启动时安装特定的路由获取处理程序,我需要从 IndexedDB(异步)查找路由数据。
不幸的是,在 IndexedDB 查找可以完成并为路由设置提取处理之前,服务工作者开始接受提取事件。
目前,我只是为此硬编码了一个特殊情况的默认处理程序,但最好让服务工作者延迟处理获取事件,直到 IndexedDB 处理在服务工作者启动时完成。
我没有找到 "waitUntil" 的方法,也许我错过了?
代码片段会有所帮助,因为我对这个问题不是 100% 清楚...但是做一些猜测:
除非您在侦听安装事件时解决提供给 event.waitUntil 的承诺,否则 SW 不应拦截任何网络请求,因此在那里设置 IDB 应该没问题。
一般来说,只使用获取事件侦听器 运行 并且不执行任何操作也很好,因为在这种情况下浏览器会正常回退到网络。
总的来说,还值得牢记的是,SW 可以而且确实会经常被杀死,因此局部变量不会在接收不同事件之间停留。如果在处理不同的事件时需要一些数据,您应该将其保存在 IDB 或缓存中 API 并再次从那里获取。
有一个解决方法:
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
}));
};
由于我使用 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);
});
};