J'essaie donc de m'abonner à un service simple qui renvoie des données à partir d'un fichier JSON local.
J'ai réussi à faire fonctionner le service, je peux le déconnecter dans la fonction, mais lorsque je m'abonne au service dans le composant angulaire 2, il est toujours indéfini. Je ne sais pas pourquoi? Toute aide serait très appréciée.
Service API
export class ApiService {
public data: any;
constructor(private _http: Http) {
}
getData(): any {
return this._http.get('api.json').map((response: Response) => {
console.log('in response', response.json()); //This logs the Object
this.data = response.json();
return this.data;
})
.catch(this.handleError);
}
}
Composant
export class AppComponent {
public data: any
public informationData;
constructor(private _api: ApiService) {}
public ngOnInit(): void {
console.log(this.getDataFromService()); // This return undefined
}
public getDataFromService() {
this._api.getData().subscribe(response => {
this.informationData = response;
return this.informationData;
});
}
}
Peut-être que quelques images aident?
Les chiffres ici indiquent l'ordre des opérations.
subscribe
sur l'observable renvoyé.get
est soumise au serveur pour traitement.ngOnInit
est terminée.Aucun code ici après la subscribe
ne peut accéder à la propriété movies
car les données n'ont pas encore été renvoyées.
Plus tard, à un moment donné ...
Si vous tentez d'accéder à la propriété de films avant l'étape 8, une erreur se produit.
Vous avez un problème entre la synchronisation et la fonction async. Votre problème est le suivant: getDateFromService
est synchrone et le contenu qu'il contient est asynchrone. Ainsi, lorsque la fonction ngOnInit
appelle getDataFromService
, votre code n'attend pas la tâche async. vous devez getDataFromService
renvoyer un observateur ou implémenter le retour de votre API (vous devez choisir).
public ngOnInit(): void {
console.log(this.getDataFromService().subscribe(data => console.log(data)); // This return undefined
}
public getDataFromService() {
return this._api.getData();
}
objResponse;
this.service.getData().subscribe((result: any)=> {
this.objResponse=result;
}
Retourner quelque chose ne sera pas nécessaire
Au lieu de vous connecter à la méthode ngOnInit () comme vous le faisiez
public ngOnInit(): void {
console.log(this.getDataFromService()); // This return undefined }
se connecter à la méthode subscribe () en tant que
export class AppComponent {
public data: any
public informationData;
constructor(private _api: ApiService) {}
public ngOnInit(): void {
this.getDataFromService(); //don't log here, logging here will return undefined
}
public getDataFromService() {
this._api.getData().subscribe(response => {
this.informationData = response;
console.log(this.informationData); //log here, like this
return this.informationData;
});
}
}