2017-03-06 4 views
2

다음 서비스의 http 요청 결과를 여러 구성 요소와 공유하려고합니다. 내가 겪고있는 문제는 getMe() 함수에 대한 각 컴포넌트의 요청이 새로운 http 호출을 작성한다는 것입니다. MeService 서비스는 페이지의 루트 모듈에있는 제공자로만 선언되고 각 * .component.ts에 가져와야하므로 이는 서비스를 여러 번 다시 제공자로 재 선언한다는 (일반적인) 실수로 인한 것이 아닙니다 하위 구성 요소. 출력에서 ​​알 수 있듯이 통화의 비동기 특성으로 인해 발생했을 가능성이 가장 높습니다. 그러나 틀린 경우 올바르게 수정합니다. 콘솔에서Angular2 서비스에서 복수 HTTP 요청 완화

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 객체]가 올바른 데이터로 채워져 있다는 것을 염두에두고이를 확인하고 명확성을 위해 JSON.Stringify()를 생략했습니다.

OBSERVATION 1 : 미정

OBSERVATION 1 : 미정

OBSERVATION 2 : 미정

OBSERVATION 3 : Object 객체]

OBSERVATION 2 : Object 객체]

관찰 3 : [대상]

내가 믿는 것은 http 호출이 반환되기 전에 각도 구성 요소가로드되어 부트 스트래핑에서 여러 요청이 발생한다는 것입니다. 이 문제를 해결하기위한 올바른 최선의 방법은 무엇입니까?

답변

2

요청 자체를 반환하고 구성 요소 내부에서 작업을 수행해보십시오. 약속을 사용해야합니까? 각도는 관측 값을 선호합니다.

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

각 구성 요소에 가입하십시오.

+0

정답으로 표시해 주므로이 작업 구현으로 이어졌습니다. [http://stackoverflow.com/questions/36271899/what-is-the-correct-way-to-share-the-result- of-an-angular-2-http-network-call-in] (http://stackoverflow.com/questions/36271899/what-is-the-correct-way-to-share-the-result-of-an -angular-2-http-network-call-in/36291681 # 36291681) –

0

chrispy의 힌트 덕분에 Observables에 뛰어 들어 실제로 비동기 http 호출을 구현하는 기본 방법이라고 생각됩니다. 그러나 구성 요소에서 구독 만해도 서비스에서 API로 여러 번 호출되는 것을 막지 못했지만 this answer이라는 메시지가 나올 때까지 작동하지 않았습니다. 나는 그것이 최선의 관행인지 아닌지는 모르지만 그것은 효과적이다.