如何遍历Angular 4中的observable

时间:2017-10-08 12:04:04

标签: angular loops rxjs observable

我有一系列的部分,我试图获取并显示每个部分下的所有项目。这看起来很简单。这是我的代码:

//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.

我希望这有帮助。

1 个答案:

答案 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); 
}

我在这里直接编写了这段代码,所以它可能无效,但它背后的想法应该是你需要的:)