serviceWorker.getRegistration和serviceWorker.ready.then之间的区别

owe*_*ncm 5 service-worker

我正在与Service Workers一起编写我的第一个应用程序,并试图获取注册以便与pushManager进行交互。

我可以使用以下任一方法执行此操作:

nagivator.serviceWorker.getRegistration()
Run Code Online (Sandbox Code Playgroud)

要么

navigator.serviceWorker.ready.then()
Run Code Online (Sandbox Code Playgroud)

我应该使用哪个?有什么区别?

小智 5

据我所知,第一个不会等到ServiceWorkerRegistration具有活动的ServiceWorker。最后一个。


Ken*_*eux 5

使用ready使事情变得更简单,因为它“以返回的promise永远不会拒绝的方式设计。相反,它会等到promise通过具有活动worker的serviceworker注册来解决。” (请参阅Service Worker 规范中准备就绪的定义)。

这反过来会导致调用 Push API 的订阅方法时出现更少的故障模式。

从 getRegistration() 上下文调用subscribe会添加一些额外的失败模式:

[...剪...]

  1. 如果注册没有活动工作人员,请运行以下子步骤:
    1. 如果注册没有正在安装的worker并且没有等待的worker,则使用名称为“InvalidStateError”的DOMException拒绝promise并终止这些步骤。
    2. 等待注册的正在安装的worker或者正在等待的worker成为其活跃的worker。
    3. 如果注册未能激活任一工作人员,请使用名称为“InvalidStateError”的 DOMException 拒绝 Promise,并终止这些步骤。
    4. 一旦注册有活跃工作人员,请继续执行以下步骤。

[...剪...]