【问题标题】:Mitigate multiple http request in Angular2 Service减轻 Angular2 服务中的多个 http 请求
【发布时间】:2017-03-07 02:34:25
【问题描述】:

我正在尝试与多个组件共享来自以下服务的 http 请求的结果。我遇到的问题是每个组件对 getMe() 函数的请求都会创建一个新的 http 调用。 MeService服务只在页面的根模块中声明为provider,并在每个*.component.ts中导入,所以这不是多次将服务重新声明为provider的(常见)错误造成的在所有子组件中。您可以从输出中看出,这很可能是由于调用的异步性质引起的,但如果我错了,请纠正我。

这里是服务代码:

import { Injectable } from '@angular/core';
import { Headers, Http } from '@angular/http';

import 'rxjs/add/operator/toPromise';

@Injectable()
export class MeService {

    private apiUrl = 'api/get/me';

    private me: Object;

    constructor(private http: Http) { }

    getMe(): Promise<Object> {

        console.log("OBSERVATION 1: " + this.me);

        if (this.me) {

            //Not sure if this is correct or not, I've never reached this block yet
            return Promise.resolve(this.me)

        } else {

            return this.http.get(this.apiUrl)
                .toPromise()
                .then(response => {

                    console.log("OBSERVATION 2: " + this.me);

                    this.me = response.json();

                    console.log("OBSERVATION 3: " + this.me);

                    return this.me
                })
                .catch(this.handleError);

        }
    }

    //Not relevant, just for completeness
    private handleError(error: any): Promise<any> {

        console.error('An error occurred', error); // for demo purposes only
        return Promise.reject(error.message || error);

    }
}

控制台中的输出。请注意,[object Object] 中填充了正确的数据,我已经检查了这一点,为了清楚起见省略了 JSON.Stringify()。

观察 1:未定义

观察 1:未定义

观察 2:未定义

观察 3:[对象对象]

观察 2:[对象对象]

观察 3:[对象对象]

我认为正在发生的事情是,Angular 组件在任何 http 调用返回之前就已加载,从而导致引导时出现多个请求。缓解这种情况的正确和最佳方法是什么?

【问题讨论】:

    标签: angular angular-services angular-http


    【解决方案1】:

    尝试返回请求本身并在组件内执行操作。你必须使用承诺吗? Angular 更喜欢 observables。

    return this.http.get(this.apiUrl).map(res => res.json());
    

    然后订阅您的每个组件。

    【讨论】:

    【解决方案2】:

    感谢 chrispy 的提示,我深入研究了 Observables,看来它们确实是实现异步 http 调用的首选方式。然而,仅仅从组件中订阅并不能阻止服务对 API 的多次调用,直到我找到 this answer 才让它工作。我不确定这是否是最佳做法,但它确实有效。

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 2016-03-27
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多