そこで、ローカルのJSONファイルからデータを返す簡単なサービスにサブスクライブしようとしています。
サービスを機能させることができたので、関数でログアウトできますが、angular 2コンポーネントでサービスをサブスクライブすると、常に未定義になります。なぜですか?どんな助けも大歓迎です。
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);
}
}
成分
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;
});
}
}
おそらくいくつかの写真が役立ちますか?
ここの数字は、操作の順序を示しています。
subscribe
を呼び出します。get
要求は、処理のためにサーバーに送信されます。ngOnInit
メソッドが完成しました。subscribe
の後のコードは、データがまだ返されていないため、movies
プロパティにアクセスできません。
後のある時点で...
手順8の前にmoviesプロパティにアクセスしようとすると、エラーが発生します。
同期機能と非同期機能の間に問題があります。あなたの問題は:getDateFromService
は同期的で、中のコンテンツは非同期です。したがって、ngOnInit
関数がgetDataFromService
を呼び出すとき、コードは非同期タスクを待機しません。 getDataFromService
はオブザーバーを返すか、APIのリターンを実装する必要があります(選択する必要があります)。
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;
}
何かを返す必要はありません
NgOnInit()メソッドでログを記録する代わりに
public ngOnInit(): void {
console.log(this.getDataFromService()); // This return undefined }
subscribe()メソッド内に次のようにログインします
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;
});
}
}