Angular 如何按顺序循环异步调用?

Angular 如何按顺序循环异步调用?,angular,for-loop,asynchronous,Angular,For Loop,Asynchronous,我正在使用Angular2。我想实现的逻辑是首先获取总页码,然后,我想循环获取尽可能多的页码以从服务器获取项目。然而,由于异步调用,它并没有像我期望的那样工作 另外,在调用实际方法之前,我必须先获取票证。在最后阶段,还应该对从服务器获取的所有项目进行排序和分组。以下代码是我尝试过的代码。我认为这是不对的 ngOnInit(): void { let page_count: number = 1; if(this.id) { this.se

我正在使用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()})
     });
    }
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中使用它。:)