我如何等待异步管道完成并在不订阅的情况下调用另一个函数

时间:2019-06-04 18:03:38

标签: angular rxjs

说我有这个Observable:

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

然后我有:

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

因为初始化是在可观察完成之前触发的,所以除了window.customService.init()触发之前,除了setTimeout或订阅observable并使用非异步属性来设置模板中的设置之外,还有其他方法可以延迟吗?

2 个答案:

答案 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()
  }