I'd do it like the following:
function mockRequest() {
return Observable.of('[{"id": 1}, {"id": 2}, {"id": 3}]');
}
function otherMockRequest(id) {
return Observable.of(`{"id":${id}, "desc": "description ${id}"}`);
}
class ItemsService {
fetchItems() {
return mockRequest()
.map(res => JSON.parse(res))
.concatAll()
.mergeMap(item => this.fetchItem(item));
}
fetchItem(item: Item) {
return otherMockRequest(item.id)
.map(res => JSON.parse(res));
}
}
let service = new ItemsService();
service.fetchItems().subscribe(val => console.log(val));
See live demo: http://plnkr.co/edit/LPXfqxVsI6Ja2J7RpDYl?p=preview
I'm using a trick with .concatAll()
to convert an array of Objects such as [{"id": 1}, {"id": 2}, {"id": 3}]
into separate values emitted one by one {"id": 1}
, {"id": 2}
and {"id": 3}
(as of now it's an undocumented feature). Then I use mergeMap()
to fetch their content in a separate request and merge it's result into the operator chain.
This plnkr example prints to console:
{ id: 1, desc: 'description 1' }
{ id: 2, desc: 'description 2' }
{ id: 3, desc: 'description 3' }
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…