RxJS 지도 연산자(사각형)의 오류를 던지는 방법
나는 조건에 근거하여 관찰 가능한 지도 운영자로부터 오류를 던지고 싶다.예를 들어, 올바른 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
목적어)이 없다bearerToken
나는 실수를 버리고 싶다.내 구독에서 두 번째 매개 변수로 전환되도록 하십시오.handleError
)은 아래와 같다.
.subscribe(success, handleError)
좋은 의견이라도 있나?
에러를 내부에 던지십시오.map()
교환원의RxJS의 모든 콜백은 try-catch block으로 포장되어 있어, 잡히고 나서, 그 다음엔 a로 보내질 것이다.error
알림
이것은 당신이 아무 것도 돌려주지 않고 단지 오류만 발생시킨다는 것을 의미한다.
map(res => {
if (res.bearerToken) {
return this.saveJwt(res.bearerToken);
} else {
throw new Error('Valid token not returned');
}
})
그throwError()
(이전의Observable.throw()
RxJS 5에서)는 단순히 다음 정보를 전송하는 관찰 가능함error
에 대한 통지.map()
뭘 돌려주든 상관없어관찰 가능한 정보를 반환하더라도map()
로 전해질 것이다.next
알림
마지막으로, 당신은 아마 사용하지 않아도 될 것이다..catchError()
(이전의catch()
RxJS 5).오류가 발생했을 때 부작용을 수행해야 하는 경우 사용하는 것이 좋다.tap(null, err => console.log(err))
(이전의do()
예를 들어, RxJS 5).
2019년 1월: RxJS 6 업데이트
하고 싶으면throw new Error()
사용할 수 없는 것처럼 보인다.return throwError(...)
와 함께switchMap
대신에map
(차이)switchMap
원시 값 대신 관측 가능한 새 값을 반환해야 함:
// this is the import needed for throwError()
import { throwError } from 'rxjs';
// 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 is
}
});
또는 보다 간결하게:
this.httpPost.pipe(switchMap(res => (res.bearerToken) ?
of(this.saveJwt(res.bearerToken)) :
throwError('Valid token not returned')
));
행동은 똑같을 거야, 그냥 다른 구문일 뿐이야.
당신은 말 그대로 파이프에서 관측 가능한 HTTP에서 다른 관측 가능한 것으로 '전환'한다고 말하고 있는데, 이것은 출력값을 '포장'하거나 또는 관측 가능한 새로운 '오류'를 의미한다.
잊지 말고 넣어라.of
아니면 헷갈리는 에러 메세지를 받게 될 것이다.
또한 'switchMap'의 장점은 원하는 경우 완전히 새로운 명령어 '사슬'을 반환할 수 있다는 것이다 - 논리로 수행할 필요가 있는 것은 무엇이든.saveJwt
.
비록 이 문제는 이미 답이 나왔지만, (위와는 조금 다를 뿐이지만) 나만의 접근법을 공유하고 싶다.
나는 맵핑과 별도로 반품되는 것을 결정하겠고, 그 반대의 경우도 마찬가지다.어떤 연산자가 가장 좋은지 잘 모르겠으니, 나는 이걸 사용할게.tap
.
this.httpPost.pipe(
tap(res => {
if (!res.bearerToken) {
throw new Error('Valid token not returned');
}
}),
map(res => this.saveJwt(res.bearerToken)),
);
던지기 오류()가 아닌 던지기 오류()의 차이 이해 https://medium.com/angular-in-depth/throwerror-is-not-throw-error-ad6c76c53377
참조URL: https://stackoverflow.com/questions/43199642/how-to-throw-error-from-rxjs-map-operator-angular
'Programing' 카테고리의 다른 글
리액션 스트라이프 요소 입력 구성요소를 사용하여 어떻게 테두리 스타일링을 배치할 수 있는가? (0) | 2022.04.08 |
---|---|
로그인 후 재연결(React.js) (0) | 2022.04.08 |
React Native(원본 반응) 기능이 있는 WebSockets를 사용하는 올바른 방법 (0) | 2022.04.07 |
반응 라우터 activeClassName이 하위 경로에 대한 활성 클래스를 설정하지 않음 (0) | 2022.04.07 |
동적 부울 속성을 VueJS 구성 요소로 전달 (0) | 2022.04.07 |