Vik*_*Vik 7 javascript promise typescript angular
我有一个用作本地数据存储的服务来跨应用程序共享数据。该服务在开始时会进行一些休息调用以初始化一些数据。它看起来像这样:
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
)
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个组件页面,我在下面做:
ngOnInit() {
for(let lead of this.dataStore.leadList){
if(lead.accepted == false)
this.newLeadsList.push(lead)
}
}
Run Code Online (Sandbox Code Playgroud)
很明显,如果初始化数据没有完成,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)
}
}
Run Code Online (Sandbox Code Playgroud)
我从头编写了代码,因此它可能有一些错误 - 可能是异步的,也应该在函数之前ngOnInit()......检查一下。
Async-await-toPromise 使您的异步函数表现为同步函数...并且 JS 会等到您的 toPromise 完成后再执行另一个 Promise...
如果我理解正确的话:您想调用您的服务“ DataStoreService.initializeData()”一次并在将来在其他组件中使用它(而不再次调用initializeData)-?- 如果是,那么您需要服务单例(也可以在上面的异步等待技术中使用)