2017-12-21 19 views
2

documentation for HttpClient 상태는 불변성에 대해 다음HttpClient API의 대부분의 클래스가 변경 불가능한 객체를 정의하는 이유는 무엇입니까?

인터셉터가 검토하고 나가는 요청 및 들어오는 응답을 돌연변이 존재한다. 그러나 HttpRequest 및 HttpResponse 클래스가 대부분 변경 불가능하다는 사실을 알면 놀랄 수 있습니다.

이유는 앱이 요청을 다시 시도 할 수 있기 때문에 인터셉터 체인이 개별 요청을 여러 번 처리 할 수 ​​있습니다. 요청을 변경할 수있는 경우 재 시도 된 요청은 원래 요청과 다를 수 있습니다. 이터 빌 러티는 인터셉터가 각 시도에 대해 동일한 요청을 볼 수 있도록합니다.

이 설명을 이해하기 어렵습니다. 누군가 설명을 해 주시겠습니까?

+1

질문이 여기에 여러 번 나타나고 github의 각도 저장소 문제 추적기 –

+0

@ Jota.Toledo, 예,이 질문에 잠시 동안 괴롭힘을 당했기 때문에 누군가가이 리소스를 추가 할 때까지 좀 기다리고있었습니다. 게다가. 인터셉터가 두절 과정에서 어떻게 작동 하는지를 설명하는 큰 기사를 끝 마치고 조사 중 일부로이 질문을 파악했습니다. –

답변

7

이 설명은 the source code을 알지 못하면 이해하기가 어렵습니다. 자세한 내용은 Insider’s guide into interceptors and HttpClient mechanics in Angular 문서에서 설명합니다.

get과 같은 http 메서드를 호출하면 Angular가 요청을 만듭니다. 그런 다음이 요청은 관찰 가능한 시퀀스를 시작하는 데 사용되며 가입시이 요청은 인터셉터 체인을 통해 전달됩니다. 여기

function get() { 
    let req: HttpRequest<any> = new HttpRequest<any>(); 
    const events$ = of(req).pipe(concatMap((req: HttpRequest<any>) => { 
     // running request through interceptors chain 
     this.handler.handle(req); 
    })); 
    return $events; 
} 

이 소스에서 주석이다 : 이것은 시퀀스 처리 (매우 단순화 된 코드)의 일환으로 수행되는 Observable.of() 초기 요청에

시작 및 실행 concatMap() 내부에 핸들러 ( 에는 모든 인터셉터가 포함됨)가 있습니다. 이런 식으로 처리기는 Observable 체인 내에서 을 실행합니다. 은 subscription에서 인터셉터가 다시 실행되도록합니다. 이로 인해 은 인터셉터를 포함하여 처리기를 다시 실행합니다.

는 그래서 $events 스트림은 HTTP 요청 방법에서 반환 및 을 시도 할 수있는 것입니다. 인터셉터는 항상 원래 요청으로 시작해야합니다. 요청이 변경 가능하고 이전 인터셉터 실행 중에 수정 될 수있는 경우이 조건을 충족시킬 수 없습니다. 따라서 요청과 모든 구성 요소는 변경 불가능해야합니다.