如何在 RxJS 6 的管道中启动 observable?

How to start observable in the pipe in RxJS 6?

我的 Angular 项目中有这个 RxJS 代码:

settingsService.getSetting('setting-name').pipe(
  map((setting: SettingInterface) => {
    // ...

    return setting;
  }),
  tap((setting: SettingInterface) => this.settingService.save(setting)),
  map((setting: SettingInterface) => {
    // ...
  })
);

在此代码中,this.settingService.save(setting) 也是一个 Observable,但未订阅。

如何在管道中启动这个 observable,等待它并继续?

重要:

有没有 RxJS 运算符可以做到这一点?

当您有一个依赖于另一个可观察对象的可观察对象时,您可以使用 RxJS 的高阶映射运算符之一,例如 switchMapconcatMapflatMapexhaustMap.每个人都有自己的目的。 Here's 一个很好的破败。本质上,在订阅后,他们将一个可观察值转换为另一个,然后 return 修改后的可观察值。

我会用switchMap来说明。

settingsService.getSetting('setting-name').pipe(
  map((setting: SettingInterface) => {
    // ...

    return setting;
  }),
  switchMap((setting: SettingInterface) => 
    this.settingService.save(setting).pipe(map(_ => setting))
  ),
  map((setting: SettingInterface) => {
    // ...
  })
);

您会注意到我已经将另一个 map 通过管道传输到内部 obesrvable:.pipe(map(saved => setting))。如果没有这个,下面的外部 map 将接收来自 this.settingService.save(setting) 的输出,而不是您需要的 setting 变量。