我正在使用ServiceWorker来实现用户通知。当用户首次访问该站点并批准该通知时,ServiceWorker将被注册并订阅:
if ('serviceWorker' in navigator) {
console.log('Service Worker is supported');
navigator.serviceWorker.register('/js/sw.js').then(function(reg) {
if(/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())){
reg.pushManager.subscribe({
userVisibleOnly: true
}).then(function(sub) {
console.log('endpoint:', sub.endpoint);
endpoint = sub.endpoint;
fetch(MY_API+encodeURIComponent(endpoint), {
credentials: 'include'
})
});
}
}).catch(function(err) {
console.log(':^(', err);
});
}
第一次访问时,此操作失败:
Uncaught (in promise) DOMException: Subscription failed - no active Service Worker
从第二次访问开始,一切正常,因为ServiceWorker当时已经处于事件状态。看来这是一个计时问题。在尝试订阅之前,如何确定ServiceWorker已成功注册并处于事件状态?
我尝试使用
navigator.serviceWorker.ready
,如下所示:if ('serviceWorker' in navigator) {
console.log('Service Worker is supported');
navigator.serviceWorker.register('/js/sw.js').then(function(sreg) {
console.log(':^)', sreg);
navigator.serviceWorker.ready.then(function(reg) {
if(/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())){
reg.pushManager.subscribe({
userVisibleOnly: true
}).then(function(sub) {
console.log('endpoint:', sub.endpoint);
endpoint = sub.endpoint;
fetch("https://www.wettfreun.de/?page=fetch&s=1&endpoint="+encodeURIComponent(endpoint), {credentials: 'include'})
});
}
});
}).catch(function(err) {
console.log(':^(', err);
});
}
现在
navigator.serviceWorker.ready.then()
内部的部分不再被调用。 最佳答案
您可以使用ServiceWorkerContainer.ready。
来自MDN的示例:
function subscribe() {
var subscribeButton = document.querySelector('.js-subscribe-button');
subscribeButton.disabled = false;
navigator.serviceWorker.ready.then(function(serviceWorkerRegistration) {
serviceWorkerRegistration.pushManager.subscribe()
.then(function(subscription) {
// The subscription was successful
subscribeButton.disabled = true;
return sendSubscriptionToServer(subscription);
})
.catch(function(error) {
if (Notification.permission === 'denied') {
console.log('Permission for Notifications was denied');
subscribeButton.disabled = true;
} else {
console.log('Unable to subscribe to push.', error);
subscribeButton.disabled = false;
}
});
});
}
关于javascript - 订阅之前,请等待ServiceWorker完成注册,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35847393/