2017-01-23 91 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

有什麼不同的方式來實現這個使用異步函數與回調? :) –