Как запустить наблюдаемое в трубе в RxJS 6?

У меня есть этот код RxJS в моем проекте Angular:

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, и на него нет подписки.

Как я могу запустить это наблюдаемое в трубе, дождаться его и продолжить?

Важный:

  • наблюдаемый save() должен начинаться после оператора prevoius map()
  • результат наблюдаемого save() не имеет значения в трубе, и я хочу отбросить его
  • наблюдаемый save() должен начинаться перед следующим оператором map()

Есть ли для этого какой-нибудь оператор RxJS?


person netdjw    schedule 24.07.2020    source источник
comment
Используйте concatMap так concatMap((setting: SettingInterface) => this.settingService.save(setting))   -  person martin    schedule 24.07.2020


Ответы (1)


Когда у вас есть наблюдаемое, которое зависит от другого наблюдаемого, вы можете использовать один из операторов сопоставления более высокого порядка RxJS, например switchMap, concatMap, flatMap или exhaustMap. У каждого своя цель. Вот хорошее изложение. По сути, при подписке они конвертируют одну наблюдаемую в другую и возвращают измененную наблюдаемую.

В качестве иллюстрации я воспользуюсь 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, которая вам нужна.

person Michael D    schedule 24.07.2020