javascript - 在 onInit 生命周期钩子(Hook)上调用时,异步函数无法按预期工作

标签 javascript angular observable

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

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

我查看的所有资源都表明,如果我需要它,加载数据库的正确方法是使用 ngOnInit() Hook ,这就是为什么我不想调用 GetData() 当来自 DOM 的某个事件被触发时。

组件

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>

应用已加载

enter image description here

点击按钮

enter image description here

编辑 按照 AlexKhymenko 的建议,使用 setTimeout() 实现 getData()

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

最佳答案

您需要做的是手动运行更改检测,例如通过调用 setTimeout。我创建了 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)
);

}

关于javascript - 在 onInit 生命周期钩子(Hook)上调用时,异步函数无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46189445/

相关文章:

angular - 模板更改@Prop() 检测

java - 传递多个参数的可观察更新

javascript - 提交表单时,设置了与 <URL> 处的跨站点资源关联的 cookie,但没有设置 `SameSite` 属性

javascript - 如果名称和日期匹配两个 API JSON 数据,如何求和?

javascript - 定义一个函数,扩展函数原型(prototype),创建两个实例,原型(prototype)被修改?

angular - 无法绑定(bind)到 'totalItems',因为它不是 'pagination' 的已知属性

spring boot rest 和带有 websocket 的 angular2(踩过 sockjs)

javascript - RxJS: BehaviorSubject 退订

node.js - 以 Angular 返回可观察值时如何处理错误?

javascript - Nodemon 和 Redwood-Broker