#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)
}
эквивалентны. {} создает блок, для этого блока требуется оператор возврата, если он используется в функции со стрелкой.