2016-05-31 9 views
0

내 Angular2 typescript 앱용 HttpClient를 만들고 있는데 오류 처리기가 작동하지 않습니다.Angular2 HTTP 클라이언트를 확장 할 때 rxjs 외부에서 메소드를 실행할 수 있습니까?

401 오류가 발생하면 이벤트를 내 보내고 오류는 catch 할 수 있지만 이벤트를 트리거하지는 않습니다. 왜냐하면 .catch를 Observable 유형의 함수에 연결해야하므로 내 HttpClient 클래스 범위에 대한 액세스 권한이 없습니다.

errorHandler (error:any) : Observable<any> { 
 
    if(error.status == 401) { 
 
    // I want to call this.myOtherMethod() here! 
 
    this.events.publish('token_expired'); // Will throw this.events is undefined 
 
    console.log(error); 
 
    } 
 

 
    return Observable.throw(error.json()); 
 
} 
 

 
get(url) : Observable<any> { 
 
    return this.http.get(url, { 
 
    headers: this.customHeaders 
 
    }).catch(this.errorHandler); 
 
}

그래서 나는이 함수 내에서 내 this.events에 액세스하지 못할 알고 있지만 해결 방법은 무엇인가? 어떻게 이벤트를 거기에 삽입 할 수 있습니까?

답변

1

errorHandler 메서드를 참조하여 this 키워드의 값을 잃어 버리는 것이 문제입니다. 그것은 JavaScript가 작동하는 방식입니다.

당신은이 방지하려면 다음을 시도 할 수 :

get(url) : Observable<any> { 
    return this.http.get(url, { 
    headers: this.customHeaders 
    }).catch((error:any) => { 
    return this.errorHandler(error); 
    }); 
} 

또는

타이프로 bind 방법을 사용하는 경우는 단점을 알고 있어야합니다
get(url) : Observable<any> { 
    return this.http.get(url, { 
    headers: this.customHeaders 
    }).catch(this.errorHandler.bind(this)); 
} 

:

+0

완벽하게 답변했습니다! 매력처럼 일했습니다. 나는 함수 유형에 대해 너무 걱정했고 scope 살해 참조를 발견하지 못했습니다. 고맙습니다! 해결 됨으로 표시되었습니다. – gfviegas