Я на самом деле не уверен насчет вашего внутреннего рекурсивного вызова getPersons (..). Но давайте представим, что это функция, которая просто возвращает вам людей относительно некоторых идентификаторов, и она не рекурсивная.
private legalIds$: Subject<number[]> = new Subject();
private personsCache$: Subject<Person[]> = new Subject();
getPersons$(ids: number[]) {
const fromCache$ = personsCache$.pipe(
map(personsCache => personsCache.filter(p => ids.includes(p.id))
);
const newPersons$ = legalIds$.pipe(
map(legalIds => getPersons(ids.filter(id => legalIds.includes(id) && !fromCache.includes(id)))
);
return combineLatest([fromCache$, newPersons$]).pipe(
map(([fromCache, newPersons]) => fromCache.concat(newPersons))
);
}
- В большинстве случаев, если у вас есть / нужно рекурсивное поведение в синхронном программировании, вы можете решите это в rx с помощью scan, потому что это состояние
- Если бы я мог немного больше понять сценарий использования / сценарий, то не было бы необходимости требовать вызова getPersons $. Обычно вы также можете предоставить Observable (например, publi c people $), который использует ids $ Observable / Subject (который предоставляется вашей функцией getPersons).