我有一系列的部分,我试图获取并显示每个部分下的所有项目。这看起来很简单。这是我的代码:
//my ngOnInit call this function
this.sectionService.GetItemList(this.selectedSectionList, this.culture)
.subscribe(
(itemList: ItemBySection[]) => {
this.itemBySection = itemList;
this.loaded = true;
},
(error: any) => this.errorMessage = error, () =>
console.log("loaded")
);
//this is my function in my service
public GetItemList(SectionItems: Sections[], strCulture): Observable<ItemBySection[]> {
let resultObservable
for (var SectionItem in SectionItems) {
let url = environment.portalWebServiceURL + "api/section/" + SectionItems[SectionItem].sectionItemID.toString() + "/" + strCulture;
resultObservable = this.http.get(url)
.catch(this.handleError)
.mergeMap(res => <ItemBySection[]>res.json());
}
return resultObservable;
}
也许我上面的解释不太清楚 所以我要做的是在循环中多次调用我的Web服务并将结果连接到一个列表中。也许这会有所帮助。
for all my sectionIDs {
call url web service with sectionID
receive results from server
add the results in my item array
}
finally display all items.
我希望这有帮助。
答案 0 :(得分:1)
问题可能是你的http流:res.json()返回被解析为json的响应的主体。 所以你应该使用.map()运算符,而不是.mergeMap()运算符。
前一个只是将转换函数应用于每个流数据并管道结果(这就是你需要的),后者将一个observable的所有值投影到你的流中(这不是你需要的)。 / p>
一些参考文献:
希望有所帮助:)
**更新**
好的,我误解了你的需求:你需要在一系列的回复中加入所有的http响应。 你可以这样做:
public GetItemList(SectionItems: Sections[], strCulture): Observable<ItemBySection[]> {
const resultObservables = []
for (var SectionItem in SectionItems) {
let url = environment.portalWebServiceURL + "api/section/" + SectionItems[SectionItem].sectionItemID.toString() + "/" + strCulture;
const response = this.http.get(url)
.catch(this.handleError)
.map(res => <ItemBySection>res.json());
resultObservables.push(response)
}
return Observable.forkJoin(resultObservables);
}
我在这里直接编写了这段代码,所以它可能无效,但它背后的想法应该是你需要的:)