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

Difference between serviceWorker.getRegistration and serviceWorker.ready.then

我正在用 Service Workers 编写我的第一个应用程序,我正在尝试注册以便与 pushManager 交互。

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

nagivator.serviceWorker.getRegistration()

navigator.serviceWorker.ready.then()

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

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

使用 ready 使事情变得更简单,因为它是 "designed in a way that the returned promise will never reject. Instead, it waits until the promise resolves with a service worker registration that has an active worker."(请参阅 Service Worker 规范中的 definition of ready)。

调用 Push API 的订阅方法时,这反过来会导致更少的失败模式。

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

[...剪断...]

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

[...剪断...]