我有一项用作本地数据存储的服务,可在整个应用程序中共享数据。
该服务在开始时进行了一些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技术中使用)

09-18 06:35