Ошибка подписки на подписку, не вызывающая улов

Я пытаюсь принять конкретное действие, если моя регистрация регистрации не удалась. Для того, чтобы подписка не получится , я удалил <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(например, в очереди с аналитикой или обновлением интерфейса).

javascript,push-notification,es6-promise,service-worker,push-api,

2

Ответов: 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

Обратите внимание, что для других асинхронных «уровней» мне также нужно будет добавлять уловы для их соответствующих обещаний, как показано с комментариями (кроме serviceWorker.readyобещания, которое на самом деле никогда не отвергается .

JavaScript, пуш-уведомления, ES6-обещание, сервис-рабочий, пуш-апи,
Похожие вопросы