【问题标题】:Angular 9: Object getting udefined in ngOinit even after assignmentAngular 9:对象在 ngOninit 中变得未定义,即使在分配之后
【发布时间】:2020-06-12 10:33:00
【问题描述】:

我正在尝试访问由 ngOnInit 中的函数分配的对象,但控制台日志显示它未定义,而在 LoadSelCompanies 订阅块中可以访问相同的变量:

export class dealComponent implements OnInit {
  selfcompanies;
  self;
  dealForm: FormGroup;
  constructor(private userService: UserService) { }
  ngOnInit() {
    this.AddControls();
    this.LoadSelCompanies();
    console.log(this.selfcompanies);
  }

  LoadSelCompanies() {
    this.userService.LoadCompanyInfo().subscribe(data => {
      this.selfcompanies = data;
      console.log(data);
      console.log(this.selfcompanies);
    });
  }

我对此一无所知,请帮助。

【问题讨论】:

  • selfcompanies 在服务调用/分配完成之前执行。
  • 方法this.LoadSelCompanies();做http调用,而它在console.log(this.selfcompanies);运行之前返回一些响应。见zeolearn.com/magazine/asynchronous-nature-of-javascript尝试使用async/awit
  • 发现此类问题的一个好方法是在其中放置几个​​断点(控制台日志也会这样做,但很高兴看到结果)。一个在 ngOnInit 的 console.log 行上,另一个在 LoadSelCompanies 的 console.log(this.selfcompanies) 上,看看哪个断点首先被击中。与 console.Log 一样,ngOnInnit 将首先触发,因为 observable 尚未完成。
  • @ajrthegreat 我同意每个人的观点。如果我在控制台中看到,我首先在日志中获取 json 对象,然后是 undefined。
  • 也尝试更改我的代码,因为我了解异步行为stackoverflow.com/questions/37230545/… 但这又不起作用

标签: angular typescript angular9


【解决方案1】:

这是一个经典的竞争条件问题。

LoadCompanyInfo() 返回一个异步的 observable, 因此

console.log(this.selfcompanies);

在赋值之前发生。

this.selfcompanies = data;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 2012-08-03
    • 2017-11-03
    • 2019-09-02
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多