推送订阅错误未触发捕获
Posted
技术标签:
【中文标题】推送订阅错误未触发捕获【英文标题】:push subscription error not triggering catch 【发布时间】:2016-10-12 21:22:42 【问题描述】:如果我的推送注册失败,我会尝试采取特定措施。为了使订阅失败,我已将<link>
删除到manifest.json
文件(我正在使用Chrome)。我按预期收到以下错误:
Uncaught (in promise) DOMException: Registration failed - manifest empty or missing
但是,此错误来自订阅代码所在的index.html:1
而不是main.js
:
function subscribe()
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);
);
else
console.log('Already subscribed');
);
)
.catch(function(e)
console.log('catch!');
// Do something
);
而且(我怀疑结果)catch
块没有触发。这是正确的行为还是我可能做错了什么?
更多详情:
我正在尝试模拟离线行为,这就是为什么我删除了指向manifest.json
的链接(除非缓存,否则离线将不可用)。如果订阅因应用离线而失败,我想在catch
中采取行动(例如,将分析命中排队或更新 UI)。
【问题讨论】:
.catch 必须处理 reg.pushManager.getSubscription().then().catch() 以检查订阅是否失败 啊!当然。我不知道我是如何在不知情的情况下使用 Promise 走到这一步的。我曾假设错误/拒绝会“冒泡”。谢谢!!仅供参考,实际上是reg.pushManager.subscribe(userVisibleOnly: true)
在投掷,所以 catch
需要在那个级别上。
【参考方案1】:
正如@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
请注意,对于其他异步“级别”,我还需要为其相应的承诺添加捕获,如 cmets 所示(serviceWorker.ready
承诺除外,实际上是never rejects。
【讨论】:
以上是关于推送订阅错误未触发捕获的主要内容,如果未能解决你的问题,请参考以下文章
VueJS 3 / 路由器 / 带有推送的重定向:未捕获(承诺中)类型错误:无法读取未定义的属性(读取“推送”)