我正在做angurjs和基于类型的应用程序,其中在构造函数中我调用负载函数,
private load(): angular.IPromise<void> {
const progTokInit: string = 'initial';
this.$scope.progress.start(progTokInit);
return this.entityService
.load(this.$scope.projectRevisionUid)
.then(resp => {
//Doing foreach and sending employeeModel
// to get the financetype of the person
resp.employeeRates.forEach(employeeModel => this.getFinanceType(employeeModel));
this.refreshCostRate(...resp.employeeRates)
.then(() => // Another Function )
.then(() => // Yet Anothoer Function )
})
}
在这里,我需要获取一个人的财务类型,如果我发送成本中心编号,我将获得数据,所以我在
getFinanceType()
函数中给出了这样的数据,private getFinanceType (employeeModel:any) {
this.costService.getFinanceType(employeeModel.person.cost_center.getValue()[0])
.then((result) => {
console.log('res ', result);
employeeModel.financeType = result;
return result;
});
}
上面的函数是异步的,所以会有一个最大的延迟来获得所有相关的数据,直到那时我需要等待移动到下一个步骤,即,只有当当前的
this.refreshCostRate(...resp.employeeRates)
函数完成它的任务时,我才需要调用getFinanceType ()
。我试过使用async/await,比如,
private async getFinanceType (employeeModel:any) {
await return this.costService.getFinanceType(employeeModel.person.cost_center.getValue()[0])
.then((result) => {
console.log('res ', result);
employeeModel.financeType = result;
return result;
});
}
但是没有任何帮助,即使数据没有完成,执行仍在继续,所以我不能在正确的时间设置
employeeModel.financeType
的数据。请帮助我处理这种情况,即等待此
getFinanceType()
完成其工作,然后再执行另一个函数和另一个函数。 最佳答案
将getFinanceType
函数修改为return承诺:
private getFinanceType (employeeModel:any) {
var value = employeeModel.person.cost_center.getValue()[0]
return this.costService.getFinanceType(value)
.then((result) => {
console.log('res ', result);
employeeModel.financeType = result;
return result;
});
}
然后从返回的承诺链:
private load(): angular.IPromise<void> {
const progTokInit: string = 'initial';
this.$scope.progress.start(progTokInit);
return this.entityService
.load(this.$scope.projectRevisionUid)
.then(resp => {
//Doing foreach and sending employeeModel
// to get the financetype of the person
var promiseArr = resp.employeeRates.map(_ => this.getFinanceType(_));
promiseArr.push(resp);
return $q.all(promiseArr);
})
.then(financeTypeArr) {
var resp = financeTypeArr.pop();
return this.refreshCostRate(...resp.employeeRates)
.then(() => // Another Function )
.then(() => // Yet Anothoer Function )
})
}
使用
$q.all
等待所有数据从服务器返回,然后再转到下一步。