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)
                  );