如何避免不必要的服务请求?

时间:2017-02-08 17:32:16

标签: angular reactive-programming angular2-observables

我有这个代码片段,可以进行一些数据处理并返回一个数组。

    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;
}

事情是每次select()运行时我必须从我的服务中调用getChampions(),因为我需要异步上下文来调用我的观察者的next()。 if子句解决了内容的复制问题,但我仍然过多地调用了我的服务。我怎样才能使服务只调用一次然后从对象本身检索数据?

PS:我必须像这样构建它,因为它依赖于来自服务的异步内容。填写我的&#34; this.options&#34;构造函数或ngOnInit()上的属性不起作用,因为select()调用会先发生,所以我必须在choose函数()中填充数组。

1 个答案:

答案 0 :(得分:0)

如果我按如下方式构造代码,那么当选择被称为my&#34; this.options&#34;还没有被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;
}

我如何确保&#34;选择&#34;只在我的NgOnInit运行后运行?