Событие синхронизации работника службы больше не запускается после первого сбоя
Это мой код события синхронизации. Я делаю неправильно, обрабатывая обещание метода 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 по умолчанию.