'Angular 8 make multiple http requests and combine all results
I am trying to use forkJoin to perform multiple http get requests and then combine all results into a simple Array using Angular 8.
The problem is that I end up with an Array of Arrays... instead of one Array of strings
My code below. All endpoints return a list of strings.
autoCompleteValues: any;
ngOnInit() {
let res1 = this.dataMessageService.getFoo1();
let res2 = this.dataMessageService.getFoo2();
let res3 = this.dataMessageService.getFoo3();
let res4 = this.dataMessageService.getFoo4();
let res5 = this.dataMessageService.getFoo5();
forkJoin([res1, res2, res3, res4, res5]).subscribe(data => {
this.autoCompleteValues = data;
console.log(this.autoCompleteValues);
});
}
What am I doing wrong? How can I combine all the results into one large Array?
Solution 1:[1]
your code is correct since that is the expected behavior of forkjoin you just need to map it a little bit
forkJoin([res1, res2, res3, res4, res5])
.pipe(map(data => data.reduce((result,arr)=>[...result,...arr],[])))
.subscribe(data =>{
this.autoCompleteValues = data;
console.log(this.autoCompleteValues);
});
Solution 2:[2]
Instead of this:
forkJoin([res1, res2]).subscribe((data) => {
console.log(data)
});
Do this:
forkJoin([res1, res2]).subscribe(([data1, data2]) => {
console.log(data1)
console.log(data2)
});
Solution 3:[3]
You can do like this
forkJoin([res1, res2, res3, res4, res5])
.pipe(map([res1, res2, res3, res4, res5])
=> [...res1, ...res2, ...res3, ...res4, ...res5])).subscribe(data => {
this.autoCompleteValues = data;
console.log(this.autoCompleteValues);
});
Make sure to import map operator too
import { map } from "rxjs/operators";
Solution 4:[4]
If any of the inner observables supplied to forkJoin error you will lose the value of any other observables that would or have already completed.
Please refer below link:- https://www.learnrxjs.io/operators/combination/forkjoin.html
Solution 5:[5]
app.component.ts
import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { forkJoin } from 'rxjs/observable/forkJoin';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
response = [];
constructor(public http: HttpClient) {
const request1 = this.http.get('https://restcountries.eu/rest/v1/name/india');
const request2 = this.http.get('https://restcountries.eu/rest/v1/name/us');
const request3 = this.http.get('https://restcountries.eu/rest/v1/name/ame');
const request4 = this.http.get('https://restcountries.eu/rest/v1/name/ja');
const requestArray = [];
requestArray.push(request1);
requestArray.push(request2);
requestArray.push(request3);
requestArray.push(request4);
forkJoin(requestArray).subscribe(results => {
console.log(results);
this.response = results;
});
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Tony Ngo |
| Solution 2 | Vahid Najafi |
| Solution 3 | Tony Ngo |
| Solution 4 | Krishan Kumar |
| Solution 5 | Yogesh Waghmare |
