ожидание внутренних наблюдаемых в rxjs - PullRequest
0 голосов
/ 24 октября 2018

У меня есть функция, которую я хочу вернуть после завершения 3 наблюдений:

initialize(){
  let src1:Observable<Account>; //initialization omitted for brevity
  let src2: Observable<User>;   //initialization omitted for brevity

  // this is one is the problem
  let src3: Observable<Company[]> = this.myHttpService.getCompanies()
                                                  .pipe(
                                                     //do something that calls `this.myHttpService.getDepartments(company.id)` for each company one at a time.
                                                   );

  return merge(src1, src2, src3);                        

}

Для src3 в каждой компании есть несколько отделов.Я хотел бы позвонить на this.myHttpService.getDepartments(company.id) для каждой компании.Только один раз все this.myHttpService.getDepartments было вызвано для каждой компании.Только тогда src3 будет завершено.

Я прошел через любое количество комбинаций concatMap, mergeMap .... и я просто не получаю его.

Как сделатьЯ беру каждую компанию, получаю их отделы (Department[]) по одной компании за раз, а затем, как только это будет сделано, src3 будет завершено?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Возможно, вы захотите попробовать что-то в этом духе.

initialize(){
  let src1:Observable<Account>; //initialization omitted for brevity
  let src2: Observable<User>;   //initialization omitted for brevity

  // this is one is the problem
  let src3: Observable<Company[]> = this.myHttpService.getCompanies().pipe(
     map(companies: Array<any> => companies.map(
       company => this.myHttpService.getDepartments(company.id)
     )),
     switchMap(getDepObsArray: Array<Observable<any>> => forkJoin(getDepObsArray))
  );

  return forkJoin(src1, src2, src3);                        

}

Идея состоит в том, чтобы использовать forkJoin, чтобы

  • src3 возвращал только один раз все вызовык завершенной услуге
  • initialize возвращает Наблюдаемое, которое испускается только тогда, когда src1 src2 и src3 завершено
0 голосов
/ 24 октября 2018

Есть много способов достичь своей цели.Вы можете использовать concatAll, mergeMap и toArray:

concatAll распаковывает массив в отдельные объекты, mergeMap преобразует эти объекты в наблюдаемые отделы отправляющей компании, а toArray собирает выходные данные функции mergeMap, чтобы убедиться, что все отделы извлекаются донаблюдаемый завершает

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

    let src3: Observable<{company: Company, departments: Department[]}[]> = this.myHttpService.getCompanies()
        .pipe(
            concatAll(), // use this if your getCompanies() function returns Observable<Company[]> to get a single company
            mergeMap(company => this.myHttpService.getDepartments(company.id).pipe(
                map(departments => ({ company, departments })))
            ),
            toArray(), // here you receive {company: Company, departments: Department[]}[]
        );
0 голосов
/ 24 октября 2018

Вы можете использовать Observable.forkJoin для достижения этой цели.

return forkJoin([src1,src2,src3]).map(result=>{
   //output as result[0], result[1], result[2]
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...