2017-02-08 56 views
0

我有這個代碼片段,它執行一些數據處理並返回一個數組。如何避免不必要的服務請求?

choose(n?: number): Observable<PickQuality[]> { 
     this.championService.getChampions() 
     .subscribe(champions => { 
      if(this.options.length == 0) 
       champions.forEach(champion => 
        this.options.push(new PickQuality(champion, 0))); 

       // Some computing happens, chosen variable is defined here 

       this.chosenObserver.next(chosen); 
     }); 


     let obs = new Observable<PickQuality[]>((observer => this.chosenObserver = observer)); 
     return obs; 
} 

的事情是我必須調用getChampions()從我的服務每次選擇()運行,因爲我需要的情況下異步調用我的觀察者的next()。 if子句解決了內容的複製,但我仍然對我的服務進行了過多的調用。我怎樣才能讓服務只被調用一次,然後從對象本身檢索數據?

PS:我必須像這樣構造它,因爲它取決於來自服務的異步內容。在構造函數或ngOnInit()中填充「this.options」屬性將不起作用,因爲choose()調用將首先發生,所以我必須在choose函數()中填充數組。

+0

什麼叫'choose()'?無論如何,這絕對不會發生在構造函數之前!通常這種異步調用應該進入ngOnInit(),並且從你的解釋中不清楚它爲什麼會失敗。 –

+0

我有一個組件調用「choose()」。我試着用console.log來找出每個被調用的時候。即使構造函數首先運行,我也不能保證getChampions()結果可用於choose()函數。 –

+0

如果我在ngOnInit()上運行異步調用,如何在調用選擇時確保內容可用? –

回答

0

如果我按如下方式構造代碼,當選擇被調用時,我的「this.options」還沒有被OnInit填充。

ngOnInit() { 
    this.championService.getChampions() 
     .subscribe(champions => { 
       champions.forEach(champion => 
        this.options.push(new PickQuality(champion, 0))); 

     }); 
} 

choose(n?: number): Observable<PickQuality[]> { 
    this.reevaluate(); 

    var sorted = this.options.sort((a, b) => b.score - a.score); 
    var chosen: PickQuality[]; 

    if(n) chosen = sorted.slice(0, n); 
    else chosen = sorted.slice(0, 1); 

    //this.chosenObserver.next(chosen); 

    let obs = new Observable<PickQuality[]>(observer => observer.next(chosen)); 
    return obs; 
} 

我怎樣才能確保「選擇」只在我的NgOnInit運行後運行?