2017-01-23 90 views
1

我正在使用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

哪里在代码arw你推this.items数组中的项目? –

+0

我对AngularJS 2不太熟悉,但只有ES5/6,并且自从Angular的构建奠定了JavaScript的基础之后,我可能会提供帮助。据我所见,你不会向“this.items”推送任何东西。无论是在for循环中还是在其外部。 – Galago

+0

你的for循环还有一件事是同步的,getItems函数是async,你无法在forloop之后无法使用console.log,即使你在this.items –

回答

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,因为我的价值将是最大即使所有的回调不会被触发尚未所以我增加checkFlag每当触发回调,并在最大结果是牵强checkFlag值将是最大和时间我们将打印this.items。

+0

它运行良好。非常感谢! –

+0

@AnnaLee请接受我的回答。 –

+0

有什么不同的方式来实现这个使用异步函数与回调? :) –