Вызов во время запуска службы PWA, которая возвращает подписку наблюдаемой - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь вызвать PWAService во время запуска приложения. Эта служба возвращает подписку:

@Injectable({
  providedIn: 'root'
})
export class PwaService {

  constructor(
    private swUpdate: SwUpdate,
    private translateService: TranslateService
  ) { }

  public checkForAppUpdate(): Subscription | undefined {
    if (this.swUpdate.isEnabled) {
      return this.swUpdate.available.subscribe(() => {
        const appNewVersion = this.translateService.instant('app.new_version_available');
        if (confirm(appNewVersion)) {
          window.location.reload();
        }
      });
    }
  }

}

Поскольку она возвращает подписку, я склонен сохранять ссылку на подписку, чтобы впоследствии отписаться, когда служба больше не нужна, то есть когда приложение остановился. Даже если эта остановка никогда не произойдет, я все равно думаю о том, чтобы отменить подписку.

this.swUpdateSubscription = this.pwaService.checkForAppUpdate();

if (this.swUpdateSubscription != null) {
  this.swUpdateSubscription.unsubscribe();
}

Было бы удобно использовать некоторые обратные вызовы, такие как ngOnInit() и ngOnDestroy(), но у меня нет любая разметка для отображения, поэтому нет шаблона. Поэтому я не думаю, что могу использовать ни компонент, ни директиву.

Я понимаю, что мог бы вызвать свою службу из PWAModule, например:

const pwaFactory = (pwaService: PwaService) => () => pwaService.checkForAppUpdate();

@NgModule({
  imports: [
    ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),
  ],
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: pwaFactory,
      deps: [ PwaService ],
      multi: true
    }
  ]
})
export class PwaModule { }

Но этот вышеупомянутый вызов pwaService.checkForAppUpdate() не сохраняет ссылку на возвращенную подписку.

Как сохранить эту ссылку на подписку, чтобы впоследствии отписаться при необходимости?

Кроме того, мне не нужна эта служба, чтобы вызывается до загрузки приложения, его можно вызвать после загрузки. Я бы хотел, чтобы эта служба не блокировала и не задерживала загрузку приложения.

Я понимаю, что что-то может быть не так в моем дизайне и в том, как я смотрю на проблему.

ОБНОВЛЕНИЕ: Я мог Обойти проблему и сохранить подписку в сервисе. Действительно, сервис может иметь метод ngOnDestroy(), в рамках которого я могу выполнить отписку:

private pwaCheckForUpdateSubscription?: Subscription;

ngOnDestroy() {
  if (this.pwaCheckForUpdateSubscription != null) {
    this.pwaCheckForUpdateSubscription.unsubscribe();
  }
}

public checkForAppUpdate(): void {
  if (this.swUpdate.isEnabled) {
    this.pwaCheckForUpdateSubscription = this.swUpdate.available.subscribe(() => {
      const appNewVersion = this.translateService.instant('app.new_version_available');
      if (confirm(appNewVersion)) {
        this.uiService.reloadPage();
      }
    });
  }
}
...