user3264740
user3264740

Reputation: 231

How to build observables that depend on other observables?

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

Answers (1)

CozyAzure
CozyAzure

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

Related Questions