推送订阅错误未触发捕获

Posted

技术标签:

【中文标题】推送订阅错误未触发捕获【英文标题】:push subscription error not triggering catch 【发布时间】:2016-10-12 21:22:42 【问题描述】:

如果我的推送注册失败,我会尝试采取特定措施。为了使订阅失败,我已将<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)。

【问题讨论】:

.catch 必须处理 reg.pushManager.getSubscription().then().catch() 以检查订阅是否失败 啊!当然。我不知道我是如何在不知情的情况下使用 Promise 走到这一步的。我曾假设错误/拒绝会“冒泡”。谢谢!!仅供参考,实际上是 reg.pushManager.subscribe(userVisibleOnly: true) 在投掷,所以 catch 需要在那个级别上。 【参考方案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

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

【讨论】:

以上是关于推送订阅错误未触发捕获的主要内容,如果未能解决你的问题,请参考以下文章

VueJS 3 / 路由器 / 带有推送的重定向:未捕获(承诺中)类型错误:无法读取未定义的属性(读取“推送”)

ionic2 推送通知错误:5 秒后设备未触发

Google PubSub:使用 AppEngine 推送端点订阅时出现 SSL 错误

未捕获的不变违规:存储错误

未捕获的类型错误:无法读取未定义的属性“注册”

VueJS:未捕获(承诺中)TypeError:无法读取未定义的属性“推送”