Angular 数据未在ngOnInit中以角速度填充

Angular 数据未在ngOnInit中以角速度填充,angular,ngoninit,Angular,Ngoninit,我调用一个虚拟web API来填充类的一个变量以进一步使用它,但后来我遇到了一个奇怪的场景,这让我很困惑: export class myClass implements OnInit{ data : any; constructor (private http:HttpClient){} ngOnInit(){ this.http.get("http://dummy.restapiexample.com/api/v1/employee/82

我调用一个虚拟web API来填充类的一个变量以进一步使用它,但后来我遇到了一个奇怪的场景,这让我很困惑:

export class myClass implements OnInit{ 
    data : any;    
    constructor (private http:HttpClient){}
    ngOnInit(){  
        this.http.get("http://dummy.restapiexample.com/api/v1/employee/82342").subscribe(e=>this.data = e);
        alert("beforeConsole");        
        console.log(this.data);
        var size = Object.keys(this.data).length;
        alert(size); 
    }
} 
变量数据仅在我使用
警报时填充(仅用于检查)。如果我删除
警报(“beforeConsole”)然后控制台给我
未定义的


我无法理解这一点。请说明实际发生的情况。

Http.get返回一个可观察的,并且是异步的。 您的console.log在请求有时间处理之前运行

将您的console.log移动到订阅中,因为一旦发出可观测数据,它将运行

this.http.get("http://dummy.restapiexample.com/api/v1/employee/82342")
   .subscribe(e => { 
     this.data = e;
     console.log(this.data);
     var size = Object.keys(this.data).length;
   });

我建议您使用异步等待

ngOnInit(): void { this.initialize(); }

async initialize(): Promise<void> {
  try {
    this.data = await this.http.get("http://dummy.restapiexample.com/api/v1/employee/82342").toPromise();
    console.log(this.data);
  } catch (e) { console.error(e); }
}
ngOnInit():void{this.initialize();}
异步初始化():承诺{
试一试{
this.data=等待this.http.get(“http://dummy.restapiexample.com/api/v1/employee/82342)。toPromise();
console.log(this.data);
}catch(e){console.error(e);}
}

什么时候可以取消定义。还尝试使用
console.log
not
alert
调试您的代码我尝试了console.log的可能重复项,但它给我的是console.log(this.data)如果我不使用alert(“beforeConsole”);试试这个
ngOnInit(){this.http.get(“http://dummy.restapiexample.com/api/v1/employee/82342subscribe(e=>{this.data=e;alert(“beforeConsole”);console.log(this.data);var size=Object.keys(this.data).length;}()=>{alert(size);});}
这类问题的答案可能已经足够多了。与其回答这个问题,不如考虑把它标记为重复的。这将有助于减少污染。谢谢:)