Programing

RxJS 지도 연산자(사각형)의 오류를 던지는 방법

c10106 2022. 4. 7. 21:10
반응형

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

반응형