Событие синхронизации работника службы больше не запускается после первого сбоя

Это мой код события синхронизации. Я делаю неправильно, обрабатывая обещание метода sync()? Разве я не должен обрабатывать обещание, которое находится внутри метода event.waitUntil()?

`self.addEventListener('sync', function(event) {
    if (event.tag == "esssync") {    
      event.waitUntil(sync()
      .then(function(data){     
        console.log(data);
        try{
          if (Notification.permission === 'granted'){
            self.registration.showNotification("Sync success" + data);
          }else{
            console.log("Sync success");
          }
        }catch(err){
          console.log("Sync success");
        }
      })
      .catch(function(err){
          console.log("Could not sync, scheduled for the next time");
      }));
    }
});`

1 ответ

Решение

Руководство Джейка Арчибальда по фоновой синхронизации является отличным источником информации; он содержит следующее:

[Обещание перешло к event.waitUntil указывает на] успех / неудачу того, что он пытается сделать. Если он выполняется, синхронизация завершена. В случае сбоя будет запланирована повторная синхронизация.

Вы переходите к обещанию, которое всегда выполняет, потому что у вас есть .catch() функция в конце этого, и вы не бросаете ошибку и не возвращаете отклоненное обещание из этого .catch(), У вас просто есть один console.log() заявление.

.catch() функция аналогична catch блок в традиционном try {} / catch {} Обработка исключений. Вы должны повторно выбросить исходную ошибку изнутри вашего catch {} блок, если вы хотите, чтобы он распространялся вверх по стеку вызовов, и то же самое относится и к .catch() если вы хотите, чтобы ошибка отклонила обещание.

event.waitUntil(
  sync()
    .then(data => /* do something with data */)
    .catch(error => {
      console.log('Could not sync; scheduled for the next time', error);
      throw error; // Alternatively, `return Promise.reject(error);`
    }))
);

Вы также можете просто пропустить .catch() целиком и полностью полагаться на то, что переходящие в event.waitUntil() должен что-то регистрировать в консоли JavaScript по умолчанию.

Другие вопросы по тегам