推送订阅错误未触发捕获

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 .