고 싶은 오류가 발생에 띄는's맵통신 기반으로 상태입니다. 예를 들면 올바른 API 데이터가 수신되지 않습니다. 십시오 다음 코드를 참조하십시오:
private userAuthenticate( email: string, password: string ) {
return this.httpPost(`${this.baseApiUrl}/auth?format=json&provider=login`, {userName: email, password: password})
.map( res => {
if ( res.bearerToken ) {
return this.saveJwt(res.bearerToken);
} else {
// THIS DOESN'T THROW ERROR --------------------
return Observable.throw('Valid token not returned');
}
})
.catch( err => Observable.throw(this.logError(err) )
.finally( () => console.log("Authentication done.") );
}
기본적으로 당신이 볼 수 있는 코드의 경우 응답(res 개체)지 않't'bearerToken'고 싶은 밖으로 던져 오류가 있습니다. 그래서 내독으로 들어가 제 2 매개 변수(handleError)는 다음과 같습니다.
.subscribe(success, handleError)
어떤 방법이 있나요?
간단한 조작으로 누구나 오류가 내부에지도()
연산자입니다. 모든 콜백에 RxJS 은 포장과 함께 시 catch 블록'll 잡아서 다음으로 보내는error
알림입니다.
이것은 당신이't 반도와 간단한 조작으로 누구나 오류가:
map(res => {
if (res.bearerToken) {
return this.saveJwt(res.bearerToken);
} else {
throw new Error('Valid token not returned');
}
})
는throwError()
(전관찰할 수 있어야 합니다.throw()
에서 RxJS5)입니다 관찰하는 그냥 보내는error
알림지만지도()
지 않't care what you 반환합니다. 는 경우에도 반환 관찰에서지도()
it'이 될 것으로 전달된 다음을 알림.
마지막 것은,아마 당신은 don't 을 사용할 필요.catchError()
(전를 잡아라()
에서 RxJS5). 을 수행해야 하는 경우 어떤 부작용을 때의 오류 발생 it's 를 사용하는 것이 좋탭(null,err=>console.로그(err))
(이전의()
에서 RxJS5)에 대한 예입니다.
Jan2019:에 대해 업데이트 RxJS6
같은 느낌이 경우던져 새로운 Error()
보이 유엔 관찰할 수처럼 사용할 수 있는switchMap
:
// RxJS 6+ syntax
this.httpPost.pipe(switchMap(res => {
if (res.bearerToken) {
return of(this.saveJwt(res.bearerToken));
}
else {
return throwError('Valid token not returned');
}
});
또는 더 간단하게:
this.httpPost.pipe(switchMap(res => (res.bearerToken) ?
of(this.saveJwt(res.bearerToken)) :
throwError('Valid token not returned')
));
동작 같은 것,그것이's 만 다른 구문입니다.
You'다시 말 그대로 말하는'스위치'http 관찰에 관하여 다른 관찰은 중'감싸고는'출력 값을,또는 새로운'error'관찰할 수 있어야 합니다.
Don't 을 넣어하는 것을 잊지의
또는 당신이'을 얻을 것이 어떤 복잡는 오류 메시지를 가지고 있습니다.
도의 아름다움'switchMap'은 반환할 수 있는 새로운'슬'의 명령하려는 경우에 상관없는 논리와 함께 할 필요가saveJwt
.
도 이 질문은 이 대답하되,나는'd 을 공유하는 나 자신의 방법(도의 약간 위에서 다른).
나는 것이 무엇인지 결정을 반환에서 별도 매핑 및 그 반대입니다. 나는'm 지 운영자가 최고의 위한 이 그래서 나는'll사용
를 누릅니다.
this.httpPost.pipe(
tap(res => {
if (!res.bearerToken) {
throw new Error('Valid token not returned');
}
}),
map(res => this.saveJwt(res.bearerToken)),
);