gpt4 book ai didi

javascript - 推送订阅错误未触发捕获

转载 作者:行者123 更新时间:2023-11-30 00:02:11 28 4
gpt4 key购买 nike

如果我的推送注册失败,我正在尝试采取特定措施。为了使订阅失败,我删除了 <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 block 不触发。这是正确的行为还是我可能做错了什么?

更多详情:我正在尝试模拟离线行为,这就是为什么我删除了指向 manifest.json 的链接的原因(除非缓存,否则离线不可用)。如果因为应用离线导致订阅失败,我想在catch中采取行动(例如,排队分析命中或更新 UI)。

最佳答案

正如@bvakiti 在他的评论中所说,catch block 必须与拒绝 promise 处于同一“级别”。因为在这种情况下 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

请注意,对于其他异步“级别”,我还需要为其相应的 promise 添加捕获,如注释所示(serviceWorker.ready promise 除外,它实际上是 never rejects

关于javascript - 推送订阅错误未触发捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40008576/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com