Angular 6 依赖服务调用



我想这个问题以前有人问过,我尝试了我能找到的每一个解决方案,但无济于事。 我对 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,但无法使它们适应我的特定情况(事实上,第一次调用返回一个数组,我需要对数组的每个元素进行第二次调用(。

这应该有效(因为你使用了"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' 运算符,该运算符将数组的可观察量转换为可观察量数组。

第二个 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
)

最新更新