我想将数据从observable设置为属性。但回复的反应需要时间。所以属性设置为undefined
。如何将数据从服务器设置为类属性
ngOnInit() {
this.comics.getChar().subscribe((responses: Response) => this.data = responses[1].json().data.results);
this.comicsList = this.data; // gives undefined
console.log(this.comicsList);
}
答案 0 :(得分:1)
您不了解异步函数的运行方式。
这一行:
this.comics.getChar().subscribe((responses: Response) => this.data = responses[1].json().data.results);
没有"完成"在进入这一行之前:
this.comicsList = this.data; // gives undefined
第一行BEGINS执行,然后下一行立即执行,无论第一行是否完成。这是异步执行的本质,你不知道什么时候会完成,所以其他所有不依赖它的东西都会继续执行。但是,在这种情况下,您的第二行明确取决于响应,因此您需要对其进行设置,以便仅在您获得响应后才会运行:
this.comics.getChar().subscribe((responses: Response) => {
this.data = responses[1].json().data.results;
this.comicsList = this.data;
});
这有点多余,除非你有理由维护这个列表的两个引用,我可能只是直接在订阅中设置comicsList。
虽然我可能不会这样做,但我这样做:
this.comicsList$ = this.comics.getChar().map(responses => responses[1].json().data.results);
在我需要此数据的模板中,我订阅了异步管道。
<div *ngFor="let comic of comicsList$ | async">{{ comic }}</div>