Как использовать две наблюдаемые функции одна внутри другой с l oop в rx js? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть одна наблюдаемая функция с именем processList(request), которая возвращает список процессов внутри страницы, и мне нужно получить список связанных процессов для каждого возвращаемого процесса, для этого я использую другую наблюдаемую функцию, которая возвращает список связанных процессов для данного процесс linkedProcessesList(process.id), вот так:

    let listOfProcesses = [];
    let listOfLinkedProcesses = [];

    this.processEndpoint.processList(request).subscribe(result => {    
        //getting list of processes for that page
        listOfProcesses = result.data;

        // now i need to get list of linked processes for each process in the listOfProcesses array
        listOfProcesses.forEach(process => {
            this.processEndpoint.linkedProcessesList((process.id).subscribe(result1 => {                
                    // here how do i populate listOfLinkedProcesses array?



                    // this.processToProcessLinkList.push(...result1.data); <- this doesn't work gives an error
                }
            });
        }
    }

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Используя forkJoin, вы можете запросить multiple requests. Это как Promise.all, но для observable.

let character = this.http.get("https://api.co/api/people/1");
let characterHomeworld = this.http.get("http://api.co/api/planets/1");
forkJoin([character, characterHomeworld]).subscribe(results => {
  results[0].homeworld = results[1];
  this.loadedCharacter = results[0];
});
0 голосов
/ 02 апреля 2020

Вы можете использовать switchMap вместе с forkJoin. Попробуйте следующее:

this.processEndpoint.processList(request)
  .pipe(
    map(result => {
      this.listOfProcesses = result.data;
      return linkedProcesses = result.data.map(item => this.processEndpoint.linkedProcessesList(item.id));
    }),
    switchMap(linkedProcessesObservables => forkJoin(linkedProcessesObservables))
  )
  .subscribe(linkedProcessesResult => {
    this.listOfLinkedProcesses = linkedProcessesResult;
  });

Я не тестировал код, поэтому могут быть некоторые изломы, чтобы сгладить.

...