如何顺序循环异步调用?

时间:2017-01-23 17:38:09

标签: angular for-loop asynchronous

我正在使用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”。我想我在异步电话中仍然很差。

1 个答案:

答案 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。