推送订阅错误不会触发catch

时间:2016-10-12 21:22:42

标签: javascript push-notification es6-promise service-worker push-api

如果我的推送注册失败,我正在尝试采取特定操作。要使订阅失败,我已将<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中采取措施(例如排队分析点击或更新用户界面)。

1 个答案:

答案 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