这是我的同步事件代码。我是否通过处理sync()方法的承诺做错了?我不应该处理event.waitUntil()方法中的promise吗?
`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");
}));
}
});`
答案 0 :(得分:1)
Jake Archibald guide to Background Sync是一个很好的信息来源;它包含以下内容:
[传递给
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控制台中记录一些内容。