Angular 我如何等待异步管道完成并在之后调用另一个函数,而不订阅
假设我有一个可观察的:Angular 我如何等待异步管道完成并在之后调用另一个函数,而不订阅,angular,rxjs,Angular,Rxjs,假设我有一个可观察的: public settings$: Observable< SettingsResponse > = this._service.getSettings(); 由于init在observable完成之前触发,除了setTimeout或订阅observable并使用非异步属性在模板中设置设置外,还有其他方法延迟吗,请在window.customService.init()触发之前?使用点击并在ngOnInit中执行设置$in public ngO
public settings$: Observable<
SettingsResponse
> = this._service.getSettings();
由于init在observable完成之前触发,除了setTimeout或订阅observable并使用非异步属性在模板中设置设置外,还有其他方法延迟吗,请在
window.customService.init()
触发之前?使用点击并在ngOnInit
中执行设置$in
public ngOnInit(): void {
this.settings$.pipe(tap(()=>window.customService.init())).subscribe()
}
您可以将其插入到observable中,并使用,以便对多个async
管道只执行一个选项卡
public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
tap(()=> this.init()),
share()
);
public init() {
if (!this.initFlag) {
window.customService.init();
this.initFlag = true;
}
}
init()是不可观察的,虽然很好,但我们需要订阅吗?我只希望设置$在window.customService.init()触发器触发之前在DOM中。您可以看到,init()在执行时依赖于DOM中已有的设置$value,否则将失败。我以前使用setTimeout,但这是一种非常糟糕的做法。setTimeout
不能保证顺序,因为异步可能需要更长的时间才能完成。如果您不想订阅,您需要创建一个init$
流,该流由settings$
和init()
组成,那么为什么您需要window.customService.init()
在订阅回调之后运行?我希望settings$在window.customService.init()触发器之前在html div中。您可以看到init()依赖于DOM中已经存在的设置$values,当它被执行时,如果值在init运行时不在div标记中,那么它将失败。我以前使用setTimeout,但这是一种非常糟糕的做法。你说的settings$
在DOM中是什么意思?我们可以看看如何在模板中使用可观察管道和async
管道吗?
public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
tap(()=> this.init()),
share()
);
public init() {
if (!this.initFlag) {
window.customService.init();
this.initFlag = true;
}
}
public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
scan((acc, next)=> (acc === "first" && this.init(), next), "first"),
share()
);
public init() {
window.customService.init();
}
public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
first(),
finalize(() => window.customService.init()),
shareReplay(1)
);