【发布时间】:2019-02-24 05:54:20
【问题描述】:
我确信这个问题之前已经被问过,但我也相信我的用例完全不同。
我正在使用 Angular 4。 我有一个服务,它调用一个获取项目列表的 http get 请求。 提取的每个项目都包含一个人的名字、姓氏、出生日期集合中的数据。
因此,当我提出这个请求时,我还需要发出另一系列 http get 请求,为列表中的每个项目发送 firstname、lastname、dob 并获取地址并为列表中的每个项目设置它在我的用户界面中。
我需要一种非阻塞的异步方式来处理它。
现在这是我处理它的方式,我的 UI 会立即加载整个模板和第一个项目。然后它会在从第一个 api 填充其余项目之前获取第二个 api 并更新该数据。
因此,页面的加载看起来确实不一致且缓慢。
请查看下面的代码并提出建议。
// the below service is the http request to get the list of items.
this._searchService.search(data).subscribe(
resp => {
this.loadaddressforeachitemindata(resp);
this.onSuccess(resp);
}, (error) => {
this.loaderService.display(false);
console.log("Error in search---"+error);
this.errorMessage = "Internal Server Error, please try after some time ";
});
onSuccess() 方法获取响应并将数据设置为模型
onSuccess(data: Response) {
this.results = this.service.buildResult( data.json().response);
this._router.navigateByUrl('/dashboard/landing/(view:people/person/results)');
}
buildresult 将数据设置到我的模型类结果中,如下所示:
export class PersonResults {
firstname?: any;
lastname?: any[];
dob?: any[];
address: any[];
}
loadaddressforeachitem() 方法包含一个 for 循环,用于遍历整个列表,调用 http get 请求以获取在第一个 http 请求中获取的每个项目的数据集
loadaddressforeachitem(data:Response){
for(let i = 0; i<numberofiteminlist ; i++){
let rowdata = data.json().response.person[i]
let firstname = rowdata.names.name.firstName;
let lastname = rowdata.names.name.lastName;
let dob = rowdata.DOBs.DOB;
let addresssearchparams = ({ firstName : firstname, lastName : lastname, dob: appdob });
this.service.getAddressData(addresssearchparams).subscribe(
res => {
this.service.storeaddressdata(res)
})
} // end of for loop
} // end of loadaddressforeachitem method
storeaddressdata() 是服务中的一种方法,用于将每个项目返回的地址推送到上述我的数据模型中的数组“地址”字段中。
【问题讨论】:
标签: angular asynchronous