说我有这个Observable:
public settings$: Observable<
SettingsResponse
> = this._service.getSettings();
然后我有:
public ngOnInit(): void {
window.customService.init();
}
因为初始化是在可观察完成之前触发的,所以除了window.customService.init()
触发之前,除了setTimeout或订阅observable并使用非异步属性来设置模板中的设置之外,还有其他方法可以延迟吗?
答案 0 :(得分:2)
您可以tap进入可观察对象,并使用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();
}
如果只需要发出 first 值,那么我将使用finalize运算符。我认为它仍然可以与async
一起触发,但我从未尝试过。
public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
first(),
finalize(() => window.customService.init()),
shareReplay(1)
);
答案 1 :(得分:-1)
使用tap
并在ngOnInit
中执行设置$
public ngOnInit(): void {
this.settings$.pipe(tap(()=>window.customService.init())).subscribe()
}