如何在angular7中修复TypeError

时间:2019-06-08 14:59:14

标签: angular typeerror

我在尝试检索类型时遇到问题

那是课程:

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对象,请提供帮助并感谢阅读。

2 个答案:

答案 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);
    });

  }

这可能会帮助您解决问题,如果我错了,请告诉我