コンポーネントがあり、サーバーからJSONをロードしてローカル変数にデータを保存する関数を呼び出し、次の行にローカル変数を読み込みますそれを操作します。もう1つを開始する前に終了操作
は、ここでは、コードです:
export class TasksComponent implements OnInit {
private tasksJSON = {};
constructor(private router: Router, private variables: Variables, private apiService: ApiService) {
if (!this.variables.getIsLoggedIn()) {
this.router.navigate(['login']);
}
}
ngOnInit() {
this.getTasks();
console.log("log 1:" + JSON.stringify(this.tasksJSON));
let tasks = this.tasksJSON.tasks;
this.tasksJSON = Object.keys(tasks).map(function(k) { return tasks[k] });
console.log("log 2:" + this.tasksJSON);
}
getTasks() {
this.apiService.getTasks().
subscribe(
data => this.tasksJSON = data,
//error => this.error = <any>error,
error => this.variables.setFailure(error),
() => console.log('log getTasks():' + JSON.stringify(this.tasksJSON)
);
}
}
問題はlet tasks = this.tasksJSON.tasks;
が始まると明らかにデータがロードされていないということですので、私はエラーを取得します。
ログは次のようになります。let tasks = this.tasksJSON.tasks;
開始は、データの読み込みが完了したときことを、
export class ApiService {
private localURL = '../app/apiFiles/';
getTasks() {
return this.http.get(this.localURL + 'tasks.json')
.map((res: Response) => res.json())
.catch(this.handleError);
}
}
方法で解決することができます:
log 1:{}
EXCEPTION: Uncaught (in promise): TypeError: can't convert undefined to object
log getTasks():{"tasks":{"epg":[{"name":"EPGStart"},{"name":"EPGStop"},{"name":"AutoTimer"},{"name":"CleanupDB"},{"name":"RefreshDB"},{"name":"ClearRecordingStats"},{"name":"CleanupRefreshDB"}],"media":[{"name":"UpdateVideoDB"},{"name":"RebuildVideoDB"},{"name":"RebuildAudioDB"},{"name":"RebuildPhotoDB"},{"name":"ClearAudioStats"},{"name":"ClearVideoStats"},{"name":"ClearPhotoStats"}],"system":[{"name":"Hibernate"},{"name":"Standby"},{"name":"Shutdown"}]}}
apiServiceは次のようになりますか?
編集:API-サービス
サブスクリプションのコールバックでこれらのことを行う必要があります。これは非同期プログラミングの基本です。あるいは、購読可能または約束をして、さらに操作してください。 – jonrsharpe