我有一项用作本地数据存储的服务,可在整个应用程序中共享数据。
该服务在开始时进行了一些rest调用以初始化一些数据。看起来像这样:
Injectable()
export class DataStoreService {
leadList: LeadModel[]
optyList: ContactModel[]
constructor(public dataService:DataService){
this.initializeData()
}
initializeData() {
this.dataService.getObjectData('opportunities').subscribe(
(data) => this.optyList = data
)
this.dataService.getObjectData('leads').subscribe(
(data) => this.leadList = data
)
}
}
我在下面做了一个组件页面:
ngOnInit() {
for(let lead of this.dataStore.leadList){
if(lead.accepted == false)
this.newLeadsList.push(lead)
}
}
很明显,如果初始化数据未能完成,则leadList可能是未定义的,并且此ngOnInit for循环也会崩溃。那么,如何在ngOnInit中等待,直到initializeData完成?
最佳答案
从构造函数中删除initializeData()
并执行以下操作:
public async initializeData()
{
this.optyList = await this.dataService.getObjectData('opportunities').toPromise();
this.leadList = await this.dataService.getObjectData('leads').toPromise();
}
async ngOnInit()
{
await initializeData();
for(let lead of this.dataStore.leadList){
if(lead.accepted == false)
this.newLeadsList.push(lead)
}
}
我从头开始编写了代码,因此可能会有一些错误-可能在函数
ngOnInit()
之前也是异步的……请检查此内容。Async-await-toPromise使您的异步功能像同步功能一样运行...并且JS等待您的toPromise完成之后再执行另一个promise ...
更新
如果我没看错:您想一次将服务称为“
DataStoreService.initializeData()
”,以后再在其他组件中使用它(无需再次调用initializeData)-吗? -如果是,则需要Service singleton(也可以在上述async-await技术中使用)