2017-03-21 2 views
0

내 서비스에서 서버에서 데이터를 가져 오는 기능이 있습니다. 내 응용 프로그램의 여러 부분에서 초기화시이 함수를 호출합니다. 그리고 내가하고 싶은 것은 : 이미 하나의 요청이 전송되고 있다면, 다른 하나는 응답을 기다린다 (그들은 자신의 요청을 할 필요가 없다).각도 2 http.get 요청이 여러 번 수행되었습니다.

그래서 내 코드는 다음과 같습니다

@Injectable() 
export class UserService implements OnInit { 
    ngOnInit(){ 
     this.getUserInformations(); 
    }; 

    public getUserInformations(forceRefresh?: boolean): Observable<Object>{ 

     if(this.userInformationsLastObservable == null) { 
      console.log('Making a request'); // called only once at init 
      this.userInformationsLastObservable = this.http.get(this.baseUrl + "informations") 
      .map((result: Response) => { 
       console.log('map is called'); // called 5 times at init 
       let userInformations = result.json(); 
       /* So future calls will perform a new request */ 
       this.userInformationsLastObservable = null; 
       return userInformations; 
      }); 
     } 

     return this.userInformationsLastObservable; 
    }; 
} 

그리고 몇 가지 구성 요소가 호출이 방법 :

@Component({ 
    selector: 'app-leaderboard', 
    templateUrl: 'leaderboard.component.html', 
    styleUrls: ['leaderboard.component.css'], 
    providers: [] 

}) 
export class LeaderboardComponent implements OnInit 
{ 
    ngOnInit(){ 
     this.userService.getUserInformations().subscribe((userInformations) => { 
     this.userInformations = userInformations; 
     /* this function does not make any call to the User service */ 
     this.refresh(); 
     },() => { 
     this.isLoading = false; 
     }); 

    }; 
} 

문제는 : 콘솔의 네트워크 패널에서, 나는 5 개 요청이 전송되는 것을 볼 수 초기화시. '지도 만들기'는 5 번 인쇄되는 반면 '요청하기'는 한 번만 호출됩니다.

내가 뭘 잘못하고 있니? 다른 요청에서 응답을받은 후 보내 당신의 도움이 enter image description here enter image description here

+0

실제로 네트워크 탭에 5 개의 네트워크 요청이 표시됩니까? 스크린 샷을 찍을 수 있습니까? – echonax

+0

예 :) (내 게시물 편집) –

+0

좋아, 이제는 앵귤러 2 서비스가 싱글 톤이 아니라는 사실을 확신 할 수 있습니다 (http://stackoverflow.com/a/36200020/6408940 참조). 약간의 테스트를 할 것입니다 –

답변

0

요청에 대한

덕분 구성 요소의 서비스의 가입 방법에 등록해야한다. 요소에서

에 관계없이 응답 배열의 길이

constructor(private _service: Service) { } 

ngOnInit() { 
    this._service.getUserInformations().subscribe(
    res => { 
     // call another service; 
    } 
} 

번째 요구는 한번만 송신된다.

+0

내 앱의 모든 부분이 동일한 요청을 호출합니다. 요청 1을 보낸 다음 요청 2를 보냅니다. 그것은 "요청 1을 보내십시오 (... 약간의 시간 ...), 요청 1을 보냅니다". 그러나 이미 하나의 "요청 1"이 보류중인 경우, 다른 요청을하는 대신 기다려야합니다. –

+0

동일하거나 다른 요청인지 여부는 중요하지 않습니다. this.http.get (this.baseUrl + "informations")은 5 요소 배열을 반환하고 .map은 5 번 반복하고 5 번은 body를 호출해야합니다. API에서 응답을 확인하십시오. – Emerceen

+0

아니요 응답은 하나의 객체 일 뿐이며 콘솔의 네트워크 탭에서 5 번의 호출을 볼 수 있습니다. –

1

문제점은 rxjs Observable 작동 방식에 대한 오해에서 비롯된 것으로 밝혀졌습니다. 나는 당신이 그 중 한 명을 구독 할 때마다 그것을 다시 실행한다는 것을 몰랐습니다. 여기에 this.userInformationsLastObservable에 가입 할 때마다 http 호출이 다시 발생합니다. 나는 전화가 창작시에만 만들어 질 것이라고 생각했고, 응답을 받으면 모든 가입자에게 통보했다.

제목을 사용하여이 문제를 해결할 것입니다.

+0

내 대답을 확인 했습니까? – echonax

+0

예.하지만 함수가 빈 Observable을 반환하면 구독자에게 HTTP 요청이 끝났음을 알리지 않고 응답을받지 못합니다. –

+0

아, 그 세부 사항에 대해 알지 못했습니다. – echonax

0
public getConfig(): ReplaySubject<HomeConfig> { 

    if (this.replayConfigRequest) { 
     return this.replayConfigRequest; 
    } 

    this.configRequest = this.http.get<HomeConfig>(this.meta.configUrl); 

    this.replayConfigRequest = new ReplaySubject<HomeConfig>(1); 

    this.configRequest.subscribe(this.replayConfigRequest); 

    return this.replayConfigRequest; 
} 
관련 문제