ServiceWorkerContainer.ready for a specific 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
});
首先,请注意,每个作用域只能有一个活动服务工作进程,客户端页面最多只能由一个服务工作进程控制。因此,当准备就绪时,您肯定知道控制页面的服务工作者处于活动状态。
要了解任意 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();
}
};
});
})
}
希望这对你有意义。
相关文章:
- Apache-specific md5 javascript impelementation for .htpsswrd
- ServiceWorkerContainer.ready for a specific scriptURL?
- “;jQuery.event.specific”;API(用于自定义事件)
- PlayFramework 2.1 : Loading page-specific Javascripts with R
- Get an specific value in <a> html with javascript-ajax
- keydown + keyup events for specific keys
- Passing specific value via POST from <img> to PHP
- jQuery target $(window) on a specific webpage
- remove a specific text from <td> element
- 在MediaWiki User Specific common.js中放入什么
- Highlight a specific part in <textarea> using JS