Search code examples
angulartypescripthttpangular-httpclient

Angular - Cannot read properties of undefined (reading 'forEach') by trying to manipulate variable after an HTTP call


I'm trying to manipulate a variable after an HTTP call. I want to use functions such as .push() or .forEach(), but it doesn't allow me because data isn't assigned to the variable at first.

I get an error in the console:

Cannot read properties of undefined (reading 'forEach')

My Component:

import {Component, OnInit} from '@angular/core';
import {TablesService} from "../tables.service";

@Component({...})

export class BigQueryComponent implements OnInit {
  fetchedData: any;
  DATA: any;

  constructor(private tableService: TablesService) {
    this.tableService.fetchAPI().subscribe((data) => {
      this.fetchedData = data;
    })
  }

  ngOnInit(): void {
    this.getQueryData();
  }

  getQueryData() {
    this.fetchedData.forEach( dataset => { 
      this.DATA.push( dataset );
    });
  }

}

My Service:

export class TablesService {

  constructor(private http: HttpClient) {}

  fetchAPI() {
    return this.http.get('https://.../products');
  }
}

How could I do this? I've tried to add Observable to the HTTP function, but I'm not sure how should it be done correctly.


Solution

  • Based on your requirement in the comment, you should move the logic from getQueryData to the subscribe function of fetchAPI. Thus, when the observable is returned, the fetchData will be assigned with data and proceed with the following logic.

    And remove this.tableService.fetchAPI().subscribe code from constructor.

    Normally we use ngOnInit() for initialization work as discussed in this question: Difference between Constructor and ngOnInit.

    constructor(private tableService: TablesService) { }
    
    getQueryData() {
      this.tableService.fetchAPI().subscribe((data) => {
        this.fetchedData = data;
    
        this.fetchedData.forEach( dataset => { 
          this.DATA.push( dataset );
        });  
      });
    }  
    

    Note:

    Will suggest these two variables are defined with array type.

    fetchedData: any[];
    DATA: any[];