Observable.forkJoin and array argument
You need to import operators that are not loaded by default. That's what EXCEPTION Observable.xxxx is not a function
usually means. You can either import all operators by adding complete rxjs
to your bootstrap, for example:
import 'rxjs/Rx'
or by importing specific operators, in your case:
import 'rxjs/add/observable/forkJoin'
Another observation/suggestion about your code: try to stick with one syntax. You are mixing es5, es6, typescript... and while it is working it will only confuse you in the long run. Also, if you're just starting with Observables, try to avoid new Observable()
and use creation operators instead;
processStuff( inputObject ) {
let observableBatch = [];
inputObject.forEach(( componentarray, key ) => {
observableBatch.push( this.http.get( key + '.json').map((res: Response) => res.json()) );
});
return Observable.forkJoin(observableBatch);
}
elsewhere() {
this.processStuff( inputObject )
.subscribe()
}
Finally, refer to the correct documentation - Angular2 uses RxJS v5 and link you provided is for RxJS v4. Docs are still incomplete for v5, but you can find descriptions in many of the source files.
Here is a working demo using Angular 12. The syntax is quite a bit different than the accepted answer (No more Observable.):
https://stackblitz.com/edit/angular-map-to-forkjoin?file=src/app/app.component.ts
NOTE: Open the Developer Tools console to see the output of what I'm doing
First, this takes an array of JSON items (In this case, an array of Users) and converts them to individual HTTP Patch calls using the map
method.
private mapCalls(users: any[]): Observable<any>[] {
return users.map(user => {
// Each User will be patched to the endpoint
// None of these calls will be made until forkJoin is used
return this.http.patch(
`https://jsonplaceholder.typicode.com/users/${user.id}`,
user
);
});
}
That is now an array of Observables. forkJoin
is added as a wrapper in order for those calls to be made
return forkJoin(mappedCalls);
The end result can then be subscribed to which will output as a single array with the same count of items.
NOTE: If one call fails in a forkJoin, THEY WILL ALL FAIL.