![](/img/trans.png)
[英]Angular2 OnInit data loading too slow causing undefined TypeError
[英]Jhipster : data loading may be too slow
使图表无法正常工作。 我正在使用ng2-charts创建图表。 我使用服务加载数据,然后将它们显示在图表中。 问题是,只有在我从服务中获取数据的那一刻到设置图表数据的那一刻之间添加了alert(),数据才能正确显示。
lightData: LightData[];
public lineChartData = Array<any>();
public lineChartLabels = Array<any>();
ngOnInit() {
this.lightData = []; // Array is empty
this.loadAll(); // Load all the datas
this.setChartData() // Set datas of my chart
}
loadAll() {
this.lightDataService.query().subscribe(
(res: Response) => this.onSuccess(res.json(), res.headers),
(res: Response) => this.onError(res.json())
);
}
public setChartData(){
for(let i =0; i< this.lightData.length; i++)
{
this.lineChartLabels.push(this.lightData[i].id);
this.lineChartData.push(this.lightData[i].value);
}
}
private onSuccess(data, headers) {
for (let i = 0; i < data.length; i++) {
this.lightData.push(data[i]);
}
}
private onError(error) {
this.alertService.error(error.message, null, null);
}
此代码不起作用,图表为空,但是,如果我添加这样的警报:
ngOnInit() {
this.lightData = []; // Array is empty
this.loadAll(); // Load all the datas
alert("blabla"); // alert to wait
this.setChartData() // Set datas of my chart
}
有用 !
我以前在其他功能上已经遇到过这个问题,但我不知道如何解决。
编辑1:尝试将setChartData调用放入装入所有异步方法中:
lightData: LightData[];
public lineChartData = Array<any>();
public lineChartLabels = Array<any>();
ngOnInit() {
this.lightData = []; // Array is empty
this.loadAll(); // Load all the datas
}
loadAll() {
this.lightDataService.query().subscribe(
(res: Response) => {
this.onSuccess(res.json(), res.headers);
this.setChartData();
},
(res: Response) => this.onError(res.json())
);
}
public setChartData(){
for(let i =0; i< this.lightData.length; i++)
{
this.lineChartLabels.push(this.lightData[i].id);
this.lineChartData.push(this.lightData[i].value);
}
}
private onSuccess(data, headers) {
for (let i = 0; i < data.length; i++) {
this.lightData.push(data[i]);
}
}
private onError(error) {
this.alertService.error(error.message, null, null);
}
还是行不通。
数据的加载是异步完成的,您的代码不会停止并等待直到加载它。 现在您执行事务的方式是执行的顺序。
this.loadAll(); // starts the request
this.setChartData(); // set the empty list as data
this.onSuccess(res.json(), res.headers); // later the request finishes
您需要做的是在收到数据后设置图表数据。 您可以通过在请求的成功处理程序中调用setChartData来实现。
loadAll() {
this.lightDataService.query().subscribe(
(res: Response) => {
this.onSuccess(res.json(), res.headers);
this.setChartData();
},
(res: Response) => this.onError(res.json())
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.