Angular 角度:串联和并联组合观测值
我无法从JSON显示数据。我有一个主要的JSON,如下所示:Angular 角度:串联和并联组合观测值,angular,typescript,rxjs,observable,angular5,Angular,Typescript,Rxjs,Observable,Angular5,我无法从JSON显示数据。我有一个主要的JSON,如下所示: "providers": [ { "id": "1", "name": "name1", "data": "http://localhost:3001/name1" }, { "id": "2", "name": "name2", "data": "http://localhost:3001/name2" } ] 需要调用数据字段中的url以获取另一个JSON文件(详细
"providers": [
{
"id": "1",
"name": "name1",
"data": "http://localhost:3001/name1"
},
{
"id": "2",
"name": "name2",
"data": "http://localhost:3001/name2"
}
]
需要调用数据字段中的url以获取另一个JSON文件(详细信息),该文件包含有关特定元素的更多信息
我现在创建了一个服务,它应该加载来自详细信息的所有提交数据,并将其安全地保存在providers.data中。我现在对我得到的答复完全感到困惑。有人能澄清或解释我在这方面做错了什么吗?以下是代码片段:
export interface Provider {
id: string;
name: string;
data: any;
}
export interface Providers {
providers: Provider[];
}
//service.ts:
getListelements() {
return this.http.get<Providers>(this.url)
.map((res) => res)
.map((providers) => {
if (providers.providers.length > 0) {
return Observable.forkJoin(
providers.providers
.map((provider: Provider) => {
return this.http.get(provider.data)
.map((res) => {
providers.providers.data = this.mapElement(res);
return providers;
});
})
);
}
return Observable.of(providers);
})
.share();
}
使用.flatMap
或.concatMap
时,我的输出返回错误
"providers": [
{
"id": "1",
"name": "name1",
"data": "http://localhost:3001/name1"
},
{
"id": "2",
"name": "name2",
"data": "http://localhost:3001/name2"
},
"data": {"id":"1", "name":"name1", "furtherinfo":"lorem ipsum"}
]
您使用的只是
map()
,其投影函数返回一个可观察(observatable.forkJoin
),但您希望订阅此可观察对象并获得其结果,而不是进一步传递该可观察对象
因此,您应该使用concatMap()
或mergeMap()
(switchMap
在这种情况下也适用),而不是map()
)
正确的!但现在我的输出没有正确映射:“提供者”:[{“id”:“1”,“name”:“name1”,“data”:“},{“id”:“2”,“name”:“name2”,“data”:“}”,data:{id:'id1',name1',imgurl:'abc.png'}]相反,我想覆盖数据字段我不知道您的数据是什么样子,但我认为这部分是
.map((res)=>{providers.providers.data=this.mapement(res);return providers;})
在提供程序中更新某些内容,然后返回它是可疑的,因为这是为每个this.http.get
响应调用的,它看起来像是在重复重写自身。好的,我明白了。。。那么,有没有最好的案例来解决几个JSON的数据处理问题呢?创建一个单独的mapper对象好吗?请看我的更新,我认为应该这样做,但因为我自己无法测试它,所以我只是猜测而已。
"providers": [
{
"id": "1",
"name": "name1",
"data": "http://localhost:3001/name1"
},
{
"id": "2",
"name": "name2",
"data": "http://localhost:3001/name2"
},
"data": {"id":"1", "name":"name1", "furtherinfo":"lorem ipsum"}
]
return this.http.get<Providers>(this.url)
.map((res) => res)
.concatMap((providers) => {
return Observable.forkJoin(...) ;
});
const observables = providers.providers
.map((provider: Provider) => this.http.get(provider.data)
.map(response => {
provider.data = this.mapElement(response);
return provider;
})
);
return Observable.forkJoin(observables)