Зависимые от Angular подписки с использованием forkJoin с блоком кода для изменения данных

#angular #typescript #rxjs #subscription

#angular #typescript #rxjs #подписка

Вопрос:

У меня есть подписка, которая зависит от результата предыдущей подписки. Я использую forkJoin, поэтому мне не нужно их вкладывать:

 this.service.service1().pipe(
    flatMap((res1) => this.service.service2(res1))
).subscribe((res2) => {
    // Do something with res2.
});
  

Проблема в том, что мне нужно изменить данные, прежде чем я вызову подписку # 2. Я хотел бы иметь возможность сделать что-то вроде этого:

 this.service.service1().pipe(
    flatMap((res1) => {
      // Modify res1 data here.
      // Make 2nd Api Call
      this.service.service2(res1)
    })
).subscribe((res2) => {
    // Do something with res2.
});
  

Нужен ли мне другой оператор / синтаксис для достижения этого или я могу изменить этот подход?

Комментарии:

1. Вы могли бы использовать map раньше flatMap , чтобы сделать это, возможно, более очевидным, но если вы не хотите возвращаться res1 , я думаю, что то, что вы делаете сейчас, прекрасно.

2. @martin Второй приведенный выше блок кода невозможен в том виде, в каком он у меня сейчас есть. flatMap не допускает {}. Это вызовет ошибку типа ‘void’, которую нельзя присвоить типу ‘ObservableInput<any>’ .

Ответ №1:

Вы не возвращали наблюдаемый объект из вашей flatMap, верните this.service.service2(res1); сделал бы то же самое, что показано ниже.

 this.service.service1().pipe(
    map(res1 => //modify resp1 here)
    flatMap((modifiedRes1) => this.service.service2(modifiedRes1)) // note the lack of brackets, this means we are returning the observable, your function returns void.
).subscribe((res2) => {
    // Do something with res2.
});
  

Разница между

 (res1) => this.service.service2(res1)
  

и

 (res1) => {
  this.service.service2(res1)
}
  

Заключается в том, что первая функция возвращает наблюдаемое, вторая возвращает void.

 (res1) => this.service.service2(res1)
  

и

 (res1) => {
  return this.service.service2(res1)
}
  

эквивалентны. {} создает блок, для этого блока требуется оператор возврата, если он используется в функции со стрелкой.