Angular 6 зависимых сервисных звонков - PullRequest
0 голосов
/ 08 июня 2018

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

Рассмотрим следующие услуги:

getSessionsByCampaign(campaignDBID: number) : Observable<CfgCampaignGroup[]>{
    return this.http.get<CfgCampaignGroup[]>('http://localhost:4567/api/configuration/sessions?campaign=' + campaignDBID);
}

getDNByDBID(dnDBID: number): Observable<CfgDN[]>{
    return this.http.get<CfgDN[]>('http://localhost:4567/api/configuration/dns?dbid=' + dnDBID);
}

У меня есть компонент, который должен:

  • получить результат getSessionsByCampaign
  • затем, для каждого возвращаемого элемента вызовите getDNByDBID (передав значение из элемента)

Самое близкое, что я должен был сделать:

this._configurationService.getSessionsByCampaign(this.campaignDBID).subscribe(dialingSessionsList => {
  this.dialingSessions = dialingSessionsList;
   dialingSessionsList.forEach((e) => {
    this._configurationService.getDNByDBID(e["CfgCampaignGroup"].origDNDBID.value).subscribe(dn => this.dns.push(dn[0]));
  }) 
});

Но, очевидно, когда я пытаюсь использовать this.dns в моем шаблоне компонента, он не определен ...

Я посмотрел на mergeMap, switchMap и forkJoin, но не могу адаптировать их для моего конкретногоситуация (тот факт, что первый вызов возвращает массив и что мне нужно сделать второй вызов для каждого элемента массива).

1 Ответ

0 голосов
/ 08 июня 2018

Это должно работать (так как вы использовали тег "angular6", я предполагаю, что rxjs 6):

this._configurationService.getSessionsByCampaign(this.campaignDBID).pipe(
    mergeMap(sessionsArray => from(sessionsArray)),
    mergeMap(session => 
       this._configurationService.getDNByDBID(session.origDNDBID.value)
    )
)

Итак, во-первых, вызывается функция getSessionsByCampaign, которая возвращает Observable массивасессий.Мы передаем эту наблюдаемую через два оператора mergeMap:

Первый mergeMap вызывает оператор from, который превращает Observable of array в массив Observables.

Второй mergeMap вызывает функцию getDNByDBIDна значение каждой из наблюдаемых в массиве.

Это будет генерировать каждый из результатов по очереди.

Если вы хотите создать одну наблюдаемую с массивом результатов, добавьтеtoArray () до конца канала, как в:

this._configurationService.getSessionsByCampaign(this.campaignDBID).pipe(
    mergeMap(sessionsArray => from(sessionsArray)),
    mergeMap(session => 
       this._configurationService.getDNByDBID(session.origDNDBID.value)
    ),
    toArray()
)

Ваш импорт будет:

import {from} from 'rxjs';
import {mergeMap, toArray} from 'rxjs/operators';

Редактировать: Это будет выглядеть так с подпиской:

this._configurationService.getSessionsByCampaign(this.campaignDBID).pipe(
    mergeMap(sessionsArray => from(sessionsArray)),
    mergeMap(session => 
       this._configurationService.getDNByDBID(session.origDNDBID.value)
    ),
    toArray()
).subscribe(
    dnArray => this.dns = dnArray,
    err => this.console.error(err); // or other, better error-handling
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...