khansen
khansen

Reputation: 205

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?

Upvotes: 10

Views: 30089

Answers (5)

Vahid Najafi
Vahid Najafi

Reputation: 5263

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)
});

Upvotes: 9

Yogesh Waghmare
Yogesh Waghmare

Reputation: 1045

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;
    });
  }
}

Upvotes: 1

Krishan Kumar
Krishan Kumar

Reputation: 403

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

Upvotes: 0

anaval
anaval

Reputation: 1148

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);
});

Upvotes: 9

Tony
Tony

Reputation: 20132

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";

Upvotes: 0

Related Questions