我坚持在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)
答案 0 :(得分:1)
看起来waitUntil需要一个promise参数,但是你正在调用一个返回undefined而不是promise的函数。尝试从postReview返回一个promise。使用胖箭头语法时,仅在不使用块{}
语法时才会发生隐式返回。所以你必须明确地返回。