服务工作者同步事件未触发

时间:2018-04-22 19:37:25

标签: promise synchronization indexeddb service-worker-events

我坚持在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 个答案:

答案 0 :(得分:1)

看起来waitUntil需要一个promise参数,但是你正在调用一个返回undefined而不是promise的函数。尝试从postReview返回一个promise。使用胖箭头语法时,仅在不使用块{}语法时才会发生隐式返回。所以你必须明确地返回。