推送订阅错误未触发捕获
push subscription error not triggering catch
如果我的推送注册失败,我正在尝试采取特定措施。为了使订阅失败,我已将 <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
块没有触发。这是正确的行为还是我可能做错了什么?
更多详情:
我正在尝试模拟离线行为,这就是为什么我删除了 link 到 manifest.json
(除非缓存,否则离线不可用)。如果订阅因应用程序离线而失败,我想在 catch
中采取行动(例如排队分析命中或更新 UI)。
正如@bvakiti 在他的评论中所说,catch
块必须与拒绝承诺位于相同的 "level" 上。由于在这种情况下 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
请注意,对于其他异步 "levels",我还需要为其相应的承诺添加捕获,如注释所示(serviceWorker.ready
承诺除外,实际上 never rejects .
如果我的推送注册失败,我正在尝试采取特定措施。为了使订阅失败,我已将 <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
块没有触发。这是正确的行为还是我可能做错了什么?
更多详情:
我正在尝试模拟离线行为,这就是为什么我删除了 link 到 manifest.json
(除非缓存,否则离线不可用)。如果订阅因应用程序离线而失败,我想在 catch
中采取行动(例如排队分析命中或更新 UI)。
正如@bvakiti 在他的评论中所说,catch
块必须与拒绝承诺位于相同的 "level" 上。由于在这种情况下 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
请注意,对于其他异步 "levels",我还需要为其相应的承诺添加捕获,如注释所示(serviceWorker.ready
承诺除外,实际上 never rejects .