0

我有:

getSth(): void {
    this.service.functionName.pipe(
      takeUntil(this.destroy$),
      distinctUntilChanged(),
      map(res => res.event)
    ).subscribe(((response) => {
      this.getAnother(response);
    }));   }

getAnother(response): void {
    this.anotherService.anotherFunctionName(response).subscribe((res) => {
      this.result = res;
    });   }

我知道在订阅中写订阅不是一个好的解决方案。如何解决?

4

2 回答 2

2

让我们使用switchMap

getSth(): void {
  this.service.functionName.pipe(
    takeUntil(this.destroy$),
    distinctUntilChanged(),
    map(res => res.event),
    switchMap(response =>
      this.anotherService.anotherFunctionName(response)
    )
  ).subscribe(response => this.result = response);
}
于 2021-11-05T08:39:22.153 回答
0

你有更多的选择,有一些*map运营商可以以不同的方式处理流程。通过您的示例,您可以使用switchMap,它会取消您正在运行的 observable (在您的示例中getAnother)。文档中有一个操作员决策树,试试吧,它会有很大帮助。

你得到switchMap这个逻辑:

  1. 我有一个现有的 Observable,并且
  2. 我想为每个值启动一个新的 Observable
  3. 并在新值到达时取消之前的嵌套 Observable
  4. 其中为每个值计算嵌套的 Observable

另一个注意事项,你应该把你takeUntil放在最后。

你可以这样写:

getSth(): void {
  this.service.functionName.pipe(
    // If service.functionName returns a new object every time distinctUntilChanged will do nothing as references won't be the same.
    // distinctUntilChanged(),
    switchMap(resp => this.anotherService.anotherFunctionName(resp.event))
    takeUntil(this.destroy$),
    ).subscribe((result) => {
      this.result = result;
    }));
}
于 2021-11-05T09:02:20.193 回答