在onInit生命周期钩子上调用异步函数时无法正常工作

问题描述:

在我的项目中,我有一个应该在启动应用程序时加载本地数据库的服务。为此,使用函数 GetData()。我尝试通过调用 ngOnInit()生命周期钩子来使用它。它将结果记录在控制台中,但属性 datum 似乎没有变化。

In my project I have a service that should load local database when the app is started. For that the function GetData() is used. I try to use it by calling at the ngOnInit() lifecycle hook. It logs the result in the console, but the property datum appears to be unchanged.

但是,如果我添加 GetData()按钮的方法,属性更改,数据按预期显示在控制台中。

However, if I add GetData() method to a button, the property changes and data is displayed in the console as intended.

我查看的所有来源都表明,如果我需要,加载数据库的正确方法是使用 ngOnInit() hook,这就是为什么当我发起来自DOM的某些事件时,我不打算调用 GetData()

All sources that I looked through suggest that the right way to load the DB if I need it right away is to use ngOnInit() hook, that's why I don't wat to call GetData() when some event from the DOM is fired.

组件

export class AppComponent implements OnInit {
  datum;
  constructor(private searchService: SearchService){ }
  getData(){
    this.searchService.getData().subscribe(
      data => {
        this.datum = data[0];
        console.log(this.datum);},
      err => console.log("E", err)
    );
  }

  ngOnInit(){
    this.getData();
  }
  title = 'app';
}

HTML

<div style="text-align:center">
  <h1>
    Welcome to {{title}}!!
    Data: {{datum | json}}
  </h1>
  <button (click)="getData()">Click Me</button>

已加载应用

点击按钮

编辑
getData() setTimeout()按照AlexKhymenko的建议

EDIT Implementation of getData() with setTimeout() as suggested by AlexKhymenko

  getData(){
    this.searchService.getData().subscribe(
      data => {
        setTimeout(() =>{
          this.datum = data[0];
        });
        console.log(this.datum);},
      err => console.log("E", err)
    );
  }


你需要做的是例如通过调用setTimeout手动运行更改检测。我创建了一个Plunker

What you need to do is to run change Detection manually for example by calling setTimeout. I have created a Plunker.

export class AppComponent implements OnInit {
  datum;
  title = 'app';

  constructor(private searchService: SearchService){ }
       }

 ngOnInit(){
   this.getData();
 }
  getData(){
      this.searchService.getData().subscribe(
  data => {
   setTimeout(() => {
            this.datum = data[0];
   })
    console.log(this.datum);},
  err => console.log("E", err)
);

}