Вы можете нажать в наблюдаемом объекте и использовать 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)
);