Событие синхронизации Service Worker не запускается

Я сохраняю рецензию, опубликованную в автономном режиме в indexedDB, и регистрирую синхронизацию с работником службы, но, вернувшись в оперативный режим, синхронизация не срабатывает, пока я не опубликую новую рецензию. После некоторых исследований я думаю, что это происходит из-за связанных обещаний в функции event.waitUntil. Возможно, кто-то может направить меня в правильном направлении:

self.addEventListener('sync', event => {
  if (event.tag == 'outbox') {
    event.waitUntil(
      postReview()
    ).catch(err => {
      if (event.lastChance) {
        self.registration.showNotification('Failed');
      }
      throw err;
    });
  }
});



postReview = () => {
  DBHelper.openDB()
    .then(db => {
      const tx = db.transaction(['outbox'], 'readonly');
      const store = tx.objectStore('outbox');
      return store.getAll();
    })
    .then(reviews => {
      return Promise.all(
        reviews.map(review => {
          const formData = new FormData();
          formData.append('restaurant_id', review.restaurant_id);
          formData.append('name', review.name);
          formData.append('rating', review.rating);
          if (review.comments.value) {
            formData.append('comments', review.comments);
          }
          return fetch(`${DBHelper.REVIEWS_URL}/`, {
            method: 'POST',
            body: formData
          }).then(data => {
            if (data) {
              return DBHelper.openDB().then(db => {
                const tx = db.transaction('outbox', 'readwrite');
                const store = tx.objectStore('outbox');
                return store.delete(review.id);
              });
            }
          }).catch((err) => console.error(err));
        })
      );
    });
};

Я всегда получаю

Cannot read property 'catch' of undefined at self.addEventListener.event (sw.js:97)

1 ответ

Похоже, что waitUntil ожидает аргумент обещания, но вы вызываете функцию, которая возвращает неопределенное значение, а не обещание. Попробуйте вернуть обещание из postReview. При использовании синтаксиса жирных стрелок неявный возврат происходит только тогда, когда блок не используется {} синтаксис. Так что вы должны явно вернуться.

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