ServiceWorkerContainer.ready 用于特定的 scriptURL?
ServiceWorkerContainer.ready for a specific scriptURL?
ServiceWorkerContainer.ready 解析为活动的 ServiceWorkerRegistration,但如果有多个服务工作者在运行(例如,来自先前页面加载的服务工作者,同一页面中的多个注册),则有多个服务工作者可以解析为.当执行一段代码时,如何确保特定的服务工作者正在处理网络事件?
也就是我怎么写一个函数registerReady(scriptURL, options)
可以这样使用:
registerReady("foo.js").then(function (r) {
// "foo.js" is active and r.active === navigator.serviceWorker.controller
fetch("/"); // uses foo.js's "fetch" handler
});
registerReady("bar.js").then(function (r) {
// "bar.js" is active and r.active === navigator.serviceWorker.controller
fetch("/"); // use bar.js's "fetch" handler
});
首先,请注意每个作用域只能有一个活动的 service worker,并且您的客户端页面最多只能由一个 service worker 控制。因此,当 ready 解决时,您肯定知道服务工作者 控制您的页面 处于活动状态。
要知道 任意 sw 是否处于活动状态,您可以注册它并检查注册中的服务人员队列并监听其状态的变化。例如:
function registerReady(swScript, options) {
return navigator.serviceWorker.register(swScript, options)
.then(reg => {
// If there is an active worker and nothing incoming, we are done.
var incomingSw = reg.installing || reg.waiting;
if (reg.active && !incomingSw) {
return Promise.resolve();
}
// If not, wait for the newest service worker to become activated.
return new Promise(fulfill => {
incomingSw.onstatechange = evt => {
if (evt.target.state === 'activated') {
incomingSw.onstatechange = null;
return fulfill();
}
};
});
})
}
希望对您有所帮助。
ServiceWorkerContainer.ready 解析为活动的 ServiceWorkerRegistration,但如果有多个服务工作者在运行(例如,来自先前页面加载的服务工作者,同一页面中的多个注册),则有多个服务工作者可以解析为.当执行一段代码时,如何确保特定的服务工作者正在处理网络事件?
也就是我怎么写一个函数registerReady(scriptURL, options)
可以这样使用:
registerReady("foo.js").then(function (r) {
// "foo.js" is active and r.active === navigator.serviceWorker.controller
fetch("/"); // uses foo.js's "fetch" handler
});
registerReady("bar.js").then(function (r) {
// "bar.js" is active and r.active === navigator.serviceWorker.controller
fetch("/"); // use bar.js's "fetch" handler
});
首先,请注意每个作用域只能有一个活动的 service worker,并且您的客户端页面最多只能由一个 service worker 控制。因此,当 ready 解决时,您肯定知道服务工作者 控制您的页面 处于活动状态。
要知道 任意 sw 是否处于活动状态,您可以注册它并检查注册中的服务人员队列并监听其状态的变化。例如:
function registerReady(swScript, options) {
return navigator.serviceWorker.register(swScript, options)
.then(reg => {
// If there is an active worker and nothing incoming, we are done.
var incomingSw = reg.installing || reg.waiting;
if (reg.active && !incomingSw) {
return Promise.resolve();
}
// If not, wait for the newest service worker to become activated.
return new Promise(fulfill => {
incomingSw.onstatechange = evt => {
if (evt.target.state === 'activated') {
incomingSw.onstatechange = null;
return fulfill();
}
};
});
})
}
希望对您有所帮助。