2017-02-08 10 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を(呼び出す必要がある)私のサービスから毎回(選択)私は私の観察者の次の()を呼び出すように非同期コンテキストを必要とするので実行します。 if節はコンテンツの複製を解決しましたが、私はまだ私のサービスに過剰な呼び出しを行います。サービスを一度呼び出すだけで、オブジェクト自体からデータを取得できるようにするにはどうすればよいですか?

PS:これは、サービスに由来する非同期コンテンツに依存するため、このように構造化しなければなりませんでした。私の "this.options"プロパティをコンストラクタまたはngOnInit()に書き込むと、choose()コールが最初に実行されるため、選択関数内で配列を埋める必要があったため、機能しません()。

+0

「選択()」とは何ですか?それが何であれ、これは間違いなくコンストラクタの前で起こることはありません!通常、そのような非同期呼び出しはngOnInit()に移る必要があります。説明から、なぜ失敗するのかは不明です。 –

+0

私は "choose()"を呼び出すコンポーネントを持っています。私は、それぞれが呼び出されたときに見つけるconsole.logを使ってみました。コンストラクタが最初に実行されても、getChampions()の結果がchoose()関数で使用できるようになるという保証はありません。 –

+0

ngOnInit()で非同期呼び出しを実行すると、選択したときにコンテンツを利用できるようにするにはどうすればよいですか? –

答えて

0

次のようにコードを構成すると、chooseが呼び出されたときに "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を実行した後でのみ「選択」を実行するにはどうすればよいですか?

関連する問題