多个HTTP请求2
问题描述:
后端的API:
网址:http://www.sample.com/getAllPersons多个HTTP请求2
[
{
"name": "ABC",
"occupation": "Student",
"address_url": "http://www.sample.com/address/person=hgjgjgyyfhg"
},
{
"name": "ABC1",
"occupation": "Carpenter",
"address_url": "http://www.sample.com/address/person=fsdafdsa"
},
{
"name": "ABC2",
"occupation": "Developer"
},
{
"name": "ABC3",
"occupation": "Tester",
"address_url": "http://www.sample.com/address/person=sgdfsgd"
}
]
网址:http://www.sample.com/address/person=hash_value
{
"address": "XYZ",
"city": "Phoenix",
"state": "Arizona",
"pin code": "3243242"
}
需要的对象的阵列: -
{
"name": "ABC",
"occupation": "Student",
"address": "XYZ",
"city": "Phoenix",
"state": "Arizona",
"pin code": "3243242"
}
我需要在视图中显示名称,occ以上述两个api网址提供每个人的完整地址。 注意:每个人的地址可能不可用。
请建议这样做异步使用HTTP服务和承诺的最佳方法/观测量的角2
我的解决方案:
创建getAllPersons的http请求的承诺。
然后功能:
- 将响应保存在组件类变量中。
- 为每个对象的address_url创建一个http promise的数组(如果存在的话)。
- 返回Promise.all([地址URL承诺数组])
在然后函数:
- 迭代响应逐一并将其添加到含组分类address_url 变量。
有没有更好的办法?还建议如果这是一个三方面的层次结构。
答
使用flatMap
和forkJoin
:
var o = http.get('http://www.sample.com/getAllPersons')
.flatMap(t=> Observable.forkJoin(
t.json().filter(x=>x.address_url != null)
.map(y=> http.get(y.address_url).map(t=>json()))
));
订阅像这样:
o.subscribe(arr=> {
//arr[0] --> address_url[0]
//arr[1] --> address_url[1]
...
});