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 }
      }))
    ))
  )
}