Событие синхронизации 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. При использовании синтаксиса жирных стрелок неявный возврат происходит только тогда, когда блок не используется {}
синтаксис. Так что вы должны явно вернуться.