如果我的推送注册失败,我正在尝试采取特定操作。要使订阅失败,我已将<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
中采取措施(例如排队分析点击或更新用户界面)。
答案 0 :(得分:1)
正如@bvakiti在评论中所说,catch
区块必须与拒绝承诺处于同一“级别”。因为在这种情况下reg.pushManager.subscribe({userVisibleOnly: true})
代码是抛出错误的,所以在该promise链的末尾需要有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
承诺除外,其实际为never rejects。