RxJS-链接多个可观察对象并在之间进行其他操作

时间:2018-11-02 17:41:50

标签: angular rxjs

我在网上看了很多东西,却找不到能描述我问题的任何东西。

我当前正在使用Angular 5。

基本上,我想执行一个put http请求,然后完成一些操作,然后再执行另一个get http请求并执行更多操作。

这是我使用嵌套订阅的代码(我知道您不应该这样做):

this.projectService.updateProject(this.project).subscribe(
  subscribe => {
    doSomethingAfterTheUpdate();
    this.projectService.get(this.id).subscribe(
      subscribe => {
        doSomethingAfterTheGet();
        });
    });

如您所见,我正在更新项目,然后获取项目。如何使用RxJS正确执行此操作。我已经研究了Concat和MergeMap方法,但是我想在更新和get之后都执行一些操作。

2 个答案:

答案 0 :(得分:1)

您可能认为doSomethingAfterTheUpdate有副作用,所以您可以这样做:

import { mergeMap, tap } from 'rxjs/operators';

this.projectService.updateProject(this.project).pipe(
   tap(_ => this.doSomethingAfterTheUpdate()),
   mergeMap(_ => this.projectService.get(this.id))
).subscribe(_ => this.doSomethingAfterTheGet());

请注意,我在某些管道操作上使用了_,因为您实际上并没有使用范围值。

答案 1 :(得分:1)

您应该能够使用运算符tapswitchMap来实现此目的:

import { switchMap, tap } from 'rxjs/operators';

// ...

this.projectService.updateProject(this.project)
  .pipe(
    tap(() => doSomethingAfterTheUpdate()),
    switchMap(() => this.projectService.get(this.id)),
    tap(() => doSomethingAfterTheGet())
  )
  .subscribe(results => console.log(results));

希望有帮助!