angular - NGRX/RXJS: Ako rekurzívne mapovať pozorovateľné toky do jedného plochého toku
Momentálne mám nasledujúcu štruktúru objektu v Ngrx Store:
class Case {
id: string; // an id to uniquely identify the Case
type: string; // an id to identify the type of the Case
links: { [ type: string ]: string }; // a dictionary of links to the current Case.
// the keys are the type of the Case, and the values are the actual id's of the linked Cases.
// These linked cases are in the same store as the Parent Case
}
Tento prípad môžem získať z obchodu pomocou metódy getCase(caseId: string): Observable<Case> z caseService
Potrebujem vytvoriť metódu, ktorá vezme ID prípadu a vyhľadá v úložisku tento prípad a všetky jeho odkazy. Tieto odkazy je potrebné rekurzívne načítať pre všetky prepojené prípady.
Táto metóda musí vrátiť prípad, ako aj všetky jeho odkazy, v nasledujúcej štruktúre:
class CaseLinks {
case: Case;
links: { type: string, items: CaseLinks[] }[]
}
To znamená, že potrebujem signatúru metódy getCaseLinks(baseCaseId: string): Observable<CaseLinks>
Existuje nejaký spôsob, ako môžem dotazovať položku z obchodu a na základe odkazov v prípade rekurzívne dotazovať obchod pre prepojené prípady a vrátiť výsledok všetkých observables do jedného, plochého, observable streamu.
Nižšie som pridal Stackblitz obsahujúci malý príklad použitia a toho, čo chcem dosiahnuť. Dúfam, že to objasní niekoľko vecí:
https://stackblitz.com/edit/angular-ovpgsh
Odpoveď č. 1
Pokiaľ už máte selektory getCase a getLink, vyskúšajte tento kód :
function getCaseLinks(caseId: string) {
return this.getCase(caseId).pipe(
mergeMap(case => combineLatest(case.links.map(link => getLink(link.id))).pipe(
map(items => ({
case,
links: { type: string, items }
}))
))
)
}
