3

如果我的推送注册失败,我正在尝试采取特定措施。为了使订阅失败,我删除<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(例如排队分析命中或更新 UI)。

4

1 回答 1

1

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

请注意,对于其他异步“级别”,我还需要为其相应的 Promise 添加捕获,如注释所示(除了serviceWorker.readyPromise,它实际上从不拒绝.

于 2016-10-13T19:42:19.557 回答