我在尝试检索类型时遇到问题
那是课程:
book: Book;
[...]
getBooksDetails(id) {
this.api.getBook(id)
.subscribe(data => {
this.book = data;
console.log(this.book);
this.isLoadingResults = false;
this.getBooksReviews(this.book.BookTitulo);
});
}
[...]
ngOnInit() {
console.log(this.route.snapshot.params.id);
this.getBooksDetails(this.route.snapshot.params.id);
console.log(this.currentUser.username);
console.log(this.book.BookTitulo);
this.reviewForm = this.formBuilder.group({
body : [null, Validators.required],
rating : [null, Validators.required]
});
}
一切都很好,直到这一行:
console.log(this.book.BookTitulo);
我收到此错误的地方:错误TypeError:无法读取未定义的属性'BookTitulo'
我认为即时通讯将方法中的结果正确分配给book对象,请提供帮助并感谢阅读。
答案 0 :(得分:0)
OnInit同步发生,而订阅不同步。因此,它查询数据并等待其他所有事件发生。当它发生时,它进入命令队列。
OnInit是同步的,因此在订阅等待答案时,会发生console.log,并且this.book是未定义的。
如果将console.log添加到订阅中,则会看到一个答案。订阅完成后必须执行的任何逻辑都必须放在订阅的响应之内。
答案 1 :(得分:0)
使用promise从方法getBooksDetails
返回数据,请参见下面的代码
getBooksDetails(id) {
return new Promise((res, rej) => {
this.api.getBook(id)
.subscribe(data => {
res(data);
this.book = data;
console.log(this.book);
this.isLoadingResults = false;
this.getBooksReviews(this.book.BookTitulo);
});
}) }
ngOnInit() {
this.getBooksDetails(this.route.snapshot.params.id).then(data => {
this.book = data;
console.log(this.book.BookTitulo);
});
}
这可能会帮助您解决问题,如果我错了,请告诉我