Reputation: 231
I'm not sure if I'll be able to explain this properly:
I am writing a data service in angular4:
getProjects(): Observable<Project[]> {
return some_observable.map((rawProjects: RawProject[]) => {
return rawProjects.map((rawProject: RawProject) => {
// do some processing
return new Project(...);
});
});
}
This works fine. But now, I need to get an ID from RawProject
and fetch data from another API that returns an observable:
getProjects(): Observable<Project[]> {
return some_observable.map((rawProjects: RawProject[]) => {
return rawProjects.map((rawProject: RawProject) => {
const vendorID = rawProject.getVendorID();
getVendorInfo(vendorID) // returns Observable<VendorInfo>
return new Project(...);
});
});
}
getVendorInfo(vendorID)
returns Observable<VendorInfo>
, and I'm not sure how to return a new Project
that needs to contain VendorInfo
. Is it possible to include VendorInfo
without changing the method signature?
Upvotes: 0
Views: 175
Reputation: 8478
If you want to wait for all the observables to resolve, you will need to use switchMap
and forkJoin
. For the "merging" of the properties, you will need to use Object.assign
:
getProjects(): Observable<Project[]> {
return some_observable.switchMap((rawProjects: RawProject[]) => {
let arrayOfProjectsObservables = rawProjects.map((rawProject: RawProject) => {
const vendorID = rawProject.getVendorID();
return getVendorInfo(venodorID) // returns Observable<VendorInfo>
.map((vendorInfo: VendorInfo) => {
//do some processing
let project = new Project(rawProject);
return Object.assign(project, vendorInfo);
})
});
return Observable.forkJoin(arrayOfProjectsObservables);
});
}
Upvotes: 2