Как сказал @bvakiti в своем комментарии, catch
блок должен находиться на том же уровне, что и отвергающее обещание. Поскольку в этом случае reg.pushManager.subscribe({userVisibleOnly: true})
код является тем, что бросает ошибку, catch
в конце этой цепочки обещаний должна быть достигнута . Обновленный код:
navigator.serviceWorker.ready
.then(function(reg) {
reg.pushManager.getSubscription()
.then(function(sub) {
if (!sub) {
reg.pushManager.subscribe({userVisibleOnly: true})
.then(function(subscription) {
console.log('Subscribed to push,', subscription);
})
// Catch here now!
.catch(function(e) {
console.log('catch statements must be on the same level!');
});
} else {
console.log('Already subscribed');
}
}); // could add catch here too
}); // no catch needed here, serviceWorker.ready never rejects
Обратите внимание, что для других асинхронных «уровней» мне также нужно будет добавлять уловы для их соответствующих обещаний, как показано с комментариями (кроме serviceWorker.ready
обещания, которое на самом деле никогда не отвергается .