Search code examples
angularserviceangular2-observablesangular-httpclient

return observable from angular service


I'm using an angular service to get data via Httpclient and fill an array and return the array to the component. I think I should use observable but I can't figure how to do it. here is my code so far" my component.ts"

import { ZoomService } from './../services/zoom.service';
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
providers: []
})
export class HomePage implements OnInit{
constructor(private zoom: ZoomService) {
}
spots: string[] = [];
ngOnInit() {
this.zoom.dosomthing();
//here I try to access the spot array in the service. but it is empty!
this.spots = this.zoom.spots;
//if I log the spots here it is an empty array!
console.log(this.spots);
}
}

and here is my service:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import * as $ from 'jquery';
@Injectable({
providedIn: 'root'
})
export class ZoomService {
spots: string[] = [];
constructor(private httpService: HttpClient) { 
}

dosomthing() {
this.httpService.get('./assets/plates/plate1/spot.json').subscribe(data 
=> {
this.spots = data as string[];
const spots = this.spots;
//here the spot array is not empty!
console.log(this.spots); 
});
}
}

Solution

  • Here, that's how you should do it.

    //component
    import { ZoomService } from './../services/zoom.service';
    import { Component, OnInit } from '@angular/core';
    @Component({
        selector: 'app-home',
        templateUrl: 'home.page.html',
        styleUrls: ['home.page.scss'],
    })
    export class HomePage implements OnInit{
        spots: string[] = [];
    
        constructor(private zoom: ZoomService) {}
    
        ngOnInit() {
           this.zoom.dosomthing()
                .subscribe((res: string[]) => {
                    this.spots = res;
                    console.log(this.spots);
                });
        }
    }
    
    //service
    import { Injectable } from '@angular/core';
    import { HttpClient } from '@angular/common/http';
    import * as $ from 'jquery';
    @Injectable({
        providedIn: 'root'
    })
    export class ZoomService {
        constructor(private httpService: HttpClient) {}
    
        dosomthing(): Observable<string[]> {
            return this.httpService.get<string[]>('./assets/plates/plate1/spot.json');
        }
    }