angular - NGRX/RXJS: Hur man rekursivt mappar observerbara strömmar till en enda platt ström
Jag har för närvarande följande objektstruktur i en 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
}
Jag kan hämta detta ärende från butiken med metoden getCase(caseId: string): Observable<Case> från en caseService
Jag behöver skapa en metod som tar id för ett ärende och frågar lagret efter ärendet och alla dess länkar. Dessa länkar behöver hämtas rekursivt för alla länkade ärenden.
Denna metod behöver returnera ärendet, samt alla dess länkar, i följande struktur:
class CaseLinks {
case: Case;
links: { type: string, items: CaseLinks[] }[]
}
Det betyder att jag behöver en metodsignatur för getCaseLinks(baseCaseId: string): Observable<CaseLinks>
Finns det något sätt som jag kan fråga efter ett objekt från butiken och, baserat på länkarna i ärendet, rekursivt fråga butiken efter länkade ärenden och returnera resultatet av alla Observables till ett enda, platt, observerbart flöde.
Nedan har jag lagt till en Stackblitz som innehåller ett litet exempel på användningsfallet och vad jag vill uppnå. Hoppas detta klargör några saker:
https://stackblitz.com/edit/angular-ovpgsh
Svar #1
Förutsatt att du redan har getCase- och getLink-selektorer, prova denna kod:
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 }
}))
))
)
}
