我正在使用Angular2。我想要实现的逻辑是首先得到总页数,然后,我想循环通过获得的页码来从服务器获取项目。但是,由于异步调用,它无法正常工作。
另外,我必须在调用实际方法之前获取票证。在最后阶段,从服务器获得的整个项目也应该进行排序和分组。以下代码是我尝试过的。我认为这不正确。
ngOnInit(): void {
let page_count: number = 1;
if(this.id) {
this.searchService.getPageNum(this.id).subscribe((data: Object) => {
page_count=(<Base>data).pageCount;
console.log("page_count\t" + page_count);
this.items = [];
for(let i=1; i<=page_count; i++) {
this.searchService.getItems(this.id, i).subscribe((data: Object) => { this.generateItems(data) ; });
}
console.log("items num\t" + this.items.length);
this.sortItems();
this.groupItems();
});
}
}
getPageNum(id: string) {
return this.userAuthService.getTicket()
.switchMap((data:string) => {
let url = this.config.baseUrl + cui + '/items?ticket=' + data;
return this.http.get(url)
.map( (responseData) => {return responseData.json()})
});
}
getItems(id: string, pageNum: number) {
return this.userAuthService.getTicket()
.switchMap((data:string) => {
let url = this.config.baseUrl + cui + '/items?ticket=' + data +'&pageNumber=' + pageNum;
return this.http.get(url)
.map( (responseData) => {return responseData.json()})
});
}
当我打印项目数量时,它确实给我“0”。我想我在异步电话中仍然很差。
答案 0 :(得分:2)
let checkFlag = 1;
for(let i=1; i<=page_count; i++) {
this.searchService.getItems(this.id, i).subscribe((data: Object) => {
this.generateItems(data) ;
checkFlag++;
if(page_count === checkFlag){
console.log("items num\t" + this.items.length); //if you are pushing items in this.generateItems function.
}
});
}
我已经使用了checkFlag,因为即使所有的回调都没有被触发,i的值也会达到最大值所以每当触发回调时我都会递增checkFlag,并且当获取最大结果时,checkFlag值将是max,那时我们将打印这个.items。