第一次失败后,服务工作者同步事件不再被触发

时间:2017-06-19 08:37:49

标签: service-worker

这是我的同步事件代码。我是否通过处理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");
      }));
    }
});`

1 个答案:

答案 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控制台中记录一些内容。