event.waitUntil在服务工作者中做了什么以及为什么需要它?

Tom*_*ica 40 javascript-events promise service-worker

MDN建议您执行以下操作来创建和填充服务工作缓存:

this.addEventListener('install', function(event) {
  event.waitUntil(
    caches.open('v1').then(function(cache) {
      return cache.addAll([
        '/sw-test/',
        '/sw-test/index.html',
        ... etc ...
      ]);
    })
  );
});
Run Code Online (Sandbox Code Playgroud)

我不明白那段代码.该waitUntil方法也被记录,似乎上面的代码是它目前存在的唯一目的:

ExtendableEvent.waitUntil()方法可延长事件的生命周期.当相关的安装事件的事件处理程序调用时,它会延迟治疗的安装工所安装,直到通过无极成功解析.这主要用于确保在填充所依赖的所有核心缓存之前不会考虑安装服务工作者.

我不明白的是:

  • waitUntil一般如何影响代码流?是否会阻止事件传播直到它的承诺结算?
  • 为什么在打开工作缓存的环境中需要它?

我问这个问题,因为我上面的代码有问题,我想了解它.

Mar*_*rco 39

正如描述所说,the ExtendableEvent.waitUntil() method extends the lifetime of the event.如果不在方法中调用它,则可以随时停止服务工作者(请参阅规范).

因此,该waitUntil方法用于告知浏览器不要终止服务工作者,直到传递给waitUntil它的promise 被解决或拒绝.

关于您的具体问题:

  • 在事件installactivate事件的情况下,它将服务工作者的状态切换延迟到(installedactivated参见waitUntil方法规范,特别是段落的最后部分).
  • 我认为我的其余部分已经回答了为什么需要它.

  • 感谢您的耐心解释.你是对的.但我发现了使用`event.waitUntil`的目的.使用`event.waitUntil`,如果`cache.addAll`提取中的任何资源失败,服务工作者可能会停止.如果没有`event.waitUntil`,即使某些`cache.addAll`提取失败,服务工作者仍将继续运行.我试过并验证了这个理论.有关详细信息,请访问:https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#install (4认同)
  • 可以停止服务工作者,因为它使用资源.浏览器努力不浪费资源,因此如果不再需要工作人员,它可能会被杀死.文档中说明了另一个原因:如果服务工作者异常操作(例如无限循环),显然您想要终止它. (2认同)
  • 这仍然是同样的原因.没有`event.waitUntil`,即使安装尚未完成(无论是成功还是不成功),浏览器都可以在任何时候终止.它在你的例子中没有`event.waitUntil`一直运行,但它仍然是一个计时的东西(你不能确定其他人使用不同的机器或未来的浏览器版本会发生相同的行为). (2认同)