Angular 如何按顺序循环异步调用?
我正在使用Angular2。我想实现的逻辑是首先获取总页码,然后,我想循环获取尽可能多的页码以从服务器获取项目。然而,由于异步调用,它并没有像我期望的那样工作 另外,在调用实际方法之前,我必须先获取票证。在最后阶段,还应该对从服务器获取的所有项目进行排序和分组。以下代码是我尝试过的代码。我认为这是不对的Angular 如何按顺序循环异步调用?,angular,for-loop,asynchronous,Angular,For Loop,Asynchronous,我正在使用Angular2。我想实现的逻辑是首先获取总页码,然后,我想循环获取尽可能多的页码以从服务器获取项目。然而,由于异步调用,它并没有像我期望的那样工作 另外,在调用实际方法之前,我必须先获取票证。在最后阶段,还应该对从服务器获取的所有项目进行排序和分组。以下代码是我尝试过的代码。我认为这是不对的 ngOnInit(): void { let page_count: number = 1; if(this.id) { this.se
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()})
});
}
ngOnInit():void{
让页面计数:数字=1;
if(this.id){
this.searchService.getPageNum(this.id).subscribe((数据:对象)=>{
页面计数=(数据);
log(“页面计数\t”+页面计数);
此参数为.items=[];
for(设i=1;i{this.generateItems(data);});
}
console.log(“items num\t”+this.items.length);
这是sortItems();
这是groupItems();
});
}
}
getPageNum(id:字符串){
返回这个.userAuthService.getTicket()
.switchMap((数据:字符串)=>{
让url=this.config.baseUrl+cui+'/items?票证='+数据;
返回此.http.get(url)
.map((responseData)=>{return responseData.json()})
});
}
getItems(id:string,pageNum:number){
返回这个.userAuthService.getTicket()
.switchMap((数据:字符串)=>{
让url=this.config.baseUrl+cui+'/items?票证='+data+'&pageNumber='+pageNum;
返回此.http.get(url)
.map((responseData)=>{return responseData.json()})
});
}
当我打印项目数时,它只给我“0”。我认为我仍然不擅长异步调用。让checkFlag=1;
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.
}
});
}
对于(设i=1;i{
这就产生了数据;
checkFlag++;
如果(页面计数===检查标志){
console.log(“items num\t”+this.items.length);//如果您正在这个.generateItems函数中推送项。
}
});
}
我使用了checkFlag,因为即使尚未触发所有回调,i的值也将是最大值,所以每当触发回调和获取最大结果时,我都会增加checkFlag,checkFlag值将是最大值,此时我们将打印此.items。在代码中,您将此.items数组中的项推到何处?我不太清楚熟悉AngularJS 2,但只熟悉ES5/6,而且Angular的构造基于Javascript,我可能会有所帮助。据我所知,您没有将任何内容推送到
this.items
。for-loop既不在for-loop内也不在for-loop外。for-loop的另一个功能是同步的,getItems函数是异步的。在for-loop之后,即使您在此推送项,您也将始终得到0。itemsaside由于项未推送到数组中,如前面的注释所述,您必须考虑到您无法预测异步回调的时间。这意味着循环将启动所有getItems函数,但当您执行console.log和sort时,结果尚未到达。这必须在响应中调用的函数中处理,在这里,您必须检查流程是否已完成,并继续排序谢谢,但我正在将项目推送到项目数组中。这是在generateItems()方法中完成的,但我没有在这里发布。是否有其他方法可以使用带有回调的异步函数来实现这一点?:)我对Angular2不太熟悉,但有一个库名async,它提供了串行执行循环的方法,循环中的下一次迭代只在第一次迭代完成时运行。Es6承诺中也提供了这一功能,但我不知道您是否可以在Angular2中使用它。:)