NGRX / RX JS: Как рекурсивно отобразить наблюдаемые потоки в один плоский поток - PullRequest
1 голос
/ 11 февраля 2020

У меня есть следующая структура объекта в хранилище Ngrx:

    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
    }

Я могу получить этот случай из хранилища с помощью метода getCase(caseId: string): Observable<Case> из caseService

I необходимо создать метод, который принимает идентификатор дела и запрашивает хранилище для дела и всех его ссылок. Эти ссылки должны быть рекурсивно извлечены для всех связанных случаев.

Этот метод должен возвращать случай и все его ссылки в следующей структуре:

    class CaseLinks {
      case: Case;
      links: { type: string, items: CaseLinks[] }[]
    }

Значение Мне нужна сигнатура метода getCaseLinks(baseCaseId: string): Observable<CaseLinks>

. В любом случае, я могу запросить элемент из магазина и, основываясь на ссылках в деле, рекурсивно запросить хранилище для связанных случаев и вернуть результат всех Наблюдаемых в единый плоский наблюдаемый поток.

Ниже я добавил Stackblitz, содержащий небольшой пример варианта использования и того, чего я хочу достичь. Надеюсь, что это проясняет несколько вещей:

https://stackblitz.com/edit/angular-ovpgsh

1 Ответ

2 голосов
/ 11 февраля 2020

Если у вас уже есть селекторы getCase и getLink, попробуйте этот код:

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