【问题标题】:How can I avoid unnecessary service requests?如何避免不必要的服务请求?
【发布时间】:2017-02-09 06:05:25
【问题描述】:

我有这段代码 sn-p 进行一些数据处理并返回一个数组。

    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()'?不管是什么,这绝对不会发生在构造函数之前!通常这样的异步调用应该进入 ngOnInit() 并且从你的解释中不清楚它为什么会失败。
  • 我有一个调用“choose()”的组件。我试过使用 console.log 来找出每个被调用的时间。即使构造函数首先运行,我也不能保证 getChampions() 结果可用于 choose() 函数。
  • 如果我在 ngOnInit() 上运行异步调用,如何确保调用选择时内容可用?

标签: angular reactive-programming angular2-observables


【解决方案1】:

如果我按如下方式构造代码,当调用选择时,我的“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 运行后运行?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2014-12-22
    • 2019-04-09
    • 1970-01-01
    • 2019-03-08
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多