2017-10-31 2 views
0

Ich habe Probleme mit der Ausführung einer einfachen Get-Anforderung an das Back-End, die einen JSON zurückgibt. Wenn ich diese Get-Anforderung in meinem Code ausführe, gibt es eine Observable zurück, die ich direkt einer Variablen über die subscribe-Methode zuweise. Es ist jedoch nur assanged und verfügbar innerhalb dieser Methode und undefined überall sonst.So führen Sie eine GET-Anforderung mit HttpClientModule ordnungsgemäß aus

Die api Service get-Methode:

public getAllProcessCategories() { 
    return this.http.get(this.apiURL + 'typeOne=PROCESSCATEGORIES&typeTwo=PROCESSCATEGORIES'); 
    } 

Die Nutzung der api:

import { ApiService } from './../api.service'; 
import { Component, OnInit } from '@angular/core'; 
import { HttpClient, HttpHeaders } from '@angular/common/http'; 
import { ProcessCategory } from './process-category'; 



@Component({ 
    selector: 'app-process-category', 
    templateUrl: './process-category.component.html', 
    styleUrls: ['./process-category.component.css'] 
}) 
export class ProcessCategoryComponent implements OnInit { 

    processCategories = []; 

    constructor(private api: ApiService) { 
    } 


    ngOnInit(): void { 
    this.fillProcessCategories(); 
    this.printAfterRequest(); 
    } 

    fillProcessCategories() { 
    this.api.getAllProcessCategories().subscribe(data => { 
     this.processCategories = data['entities']; 
     console.log(this.processCategories); 
    }); 
    } 

    printAfterRequest() { 
    for (const category of this.processCategories) { 
      console.log(category); 
    } 
    } 
} 

Iknow dass es ist, weil ich das Ergebnis erhalten möchten, bevor Httprequest beendet ist. Also, was ist der beste Weg, um eine Get-Anfrage in Winkel 4 durchzuführen, die einen JSON zurückgibt und dann diesen JSON analysiert und ihn einer Klasse zur Verwendung in meiner Komponente zuordnet?

+0

Ich schlage vor, Sie lesen ein wenig darüber, wie Observablen und asynchrone Aufrufe arbeiten. Momentan wird die Methode 'printAfterRequest' ausgeführt, bevor' fillProcessCategories' eine Chance hat, abgeschlossen zu werden. – toskv

Antwort

1

zwicken leicht Ihre API-Methode

return this.http.get(this.apiURL+ 'typeOne=PROCESSCATEGORIES&typeTwo=PROCESSCATEGORIES') 
       .map(res => { 
        return res.json(); 
       }) 
       .catch(this.handleError); 

Dann printAfterRequest bewegen Rückruf abonnieren

fillProcessCategories() { 
    this.api.getAllProcessCategories().subscribe(data => { 
     this.processCategories = data['entities']; 
     this.printAfterRequest(); 
     console.log(this.processCategories); 
    }); 
    } 
+0

Sehr geehrte Vitalii, seit sie zu Angular 4.3 gewechselt haben, wird die .json map nicht mehr benötigt (auch nicht verfügbar), da json jetzt standardmäßig als Objekt zurückgegeben wird. Und immer noch ist meine processCategories nur innerhalb des Callbacks gefüllt und nirgendwo danach zu finden. –

+0

Haben Sie versucht, sie an die Vorlage zu binden? Sie sollten verfügbar sein, nachdem der Async-Aufruf abgeschlossen wurde. in ngOnInit() sind sie nicht sofort verfügbar, da die asynchrone Anforderung Zeit braucht, um sie abzuschließen und zu laden. –

+0

Vielen Dank für die schnellen Antworten und Hilfe. Ich bekomme den Wert, wenn ich es vorschlage. Nun, meine Frage ist, arbeite ich richtig auf diese Weise oder gibt es eine bessere Möglichkeit, Anfrage zu bekommen und sie in der Komponente zu behandeln –