Как я могу дождаться завершения асинхронного канала и вызвать другую функцию после, без подписки - PullRequest
0 голосов
/ 04 июня 2019

Скажите, у меня есть это Наблюдаемое:

public settings$: Observable<
    SettingsResponse
  > = this._service.getSettings();

И затем у меня есть:

  public ngOnInit(): void {
        window.customService.init();
  }

Поскольку инициализация инициируется до того, как выполняется наблюдение, существует ли другой способ задержки, кроме setTimeout илиподписаться на observable и использовать не асинхронное свойство для установки настроек в шаблоне, до window.customService.init() trigger?

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Вы можете нажать в наблюдаемом объекте и использовать share , чтобы для многих async каналов выполнялась только одна вкладка.

public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
                        tap(()=> this.init()), 
                        share()
                  );

public init() {
    if (!this.initFlag) {
       window.customService.init();
       this.initFlag = true;
    }
}

Вы также можете использовать оператор scan и не отслеживать, была ли вызвана функция.

public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
                        scan((acc, next)=> (acc === "first" && this.init(), next), "first"), 
                        share()
                  );

public init() {
   window.customService.init();
}

Если вам нужно только первое значение , то вместо этого я бы использовал оператор finalize . Я думаю, что он все еще срабатывает с async, но я никогда не пробовал.

public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
                        first(),
                        finalize(() => window.customService.init()), 
                        shareReplay(1)
                  );

0 голосов
/ 04 июня 2019

используйте tap и выполните настройки $ in ngOnInit

 public ngOnInit(): void {

    this.settings$.pipe(tap(()=>window.customService.init())).subscribe()
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...