programing

관찰 가능한 오류를 수동으로 발생시키는 방법은 무엇입니까?

goodcopy 2023. 9. 5. 21:30
반응형

관찰 가능한 오류를 수동으로 발생시키는 방법은 무엇입니까?

저는 아래와 같이 HTTP로 휴식 통화를 하는 Angular 앱을 개발하고 있습니다.

login(email, password) {
    let headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');
    let options = new RequestOptions({ headers: headers });
    let body = `identity=${email}&password=${password}`;
    return this.http.post(`${this._configService.getBaseUrl()}/login`, body, options)
    .map((res: any) => {
        let response: any = JSON.parse(res._body);
        if (response.success == 0) {
          Observable.throw(response);  // not working
        } else if (response.success == 1) {
          console.log('success');
          localStorage.setItem('auth_token', 'authenticated');
          this.loggedIn = true;
          return response;
        }
    });
}

기본적으로 나는 내 구성 요소가 내 구독 통화에서 응답과 오류를 받기를 원합니다.

this._authenticateService.login(this.loginObj['identity'],this.loginObj['password']).subscribe(
  (success)=>{      
    this.credentialsError=null;  
    this.loginObj={};  
    this._router.navigate(['dashboard']);    
  },
  (error)=>{
    console.log(error);        
    this.credentialsError=error;     
  }
);

하지만 내 API는 항상 성공을 반환합니다.

다음과 같은 경우 오류 메시지를 기록하려면 어떻게 해야 합니까?response.success == 0구독 콜백의 오류 인수 안에서 액세스할 수 있도록 하시겠습니까?

if (response.success == 0) {
   throw Observable.throw(response);  
 } 

rxjs 6에 대한 편집:

if (response.success == 0) {
   throw throwError(response);  
 } 

rxjs 6

import { throwError } from 'rxjs';

if (response.success == 0) {
  return throwError(response);  
}

rxjs 5

import { ErrorObservable } from 'rxjs/observable/ErrorObservable';

if (response.success == 0) {
  return new ErrorObservable(response);  
}

반품 시 제공되는 항목ErrorObservable당신에게 달렸어요

rxjs 6을 사용하여

import { throwError } from 'rxjs';
throwError('hello');

rxjs 5

어느 하나

throw response;

또는

throw Observable.throw(response);

rxjs 7

throwError(() => new Error(response))

추가 정보 https://https://httpsjs.dev/권장사항/바꾸기 변경사항 #vailingerror

다음은 공식적인 예입니다(숫자 7을 방출한 다음 오류 '웁스!').

import { throwError, concat, of } from 'rxjs';

const result = concat(of(7), throwError(new Error('oops!')));
result.subscribe(x => console.log(x), e => console.error(e));

보낸 사람: https://rxjs-dev.firebaseapp.com/api/index/function/throwError

캐치 연산자 사용

this.calcSub = this.http.post(this.constants.userUrl + "UpdateCalculation", body, { headers: headers })
   .map((response: Response) => {
      var result = <DataResponseObject>response.json();
         return result;
   })
   .catch(this.handleError)
   .subscribe(
      dro => this.dro = dro,
      () => this.completeAddCalculation()
   );

다음과 같은 오류를 처리합니다.

private handleError(error: Response) {
    console.error(error); // log to console instead
    return Observable.throw(error.json().error || 'Server Error');
}

제 문제의 대부분은 수입품과 관련이 있습니다. 그래서 여기 제게 효과가 있었던 코드가 있습니다.

import {_throw} from 'rxjs/observable/throw';
login(email, password) {
...
    return this.http.post(`${this._configService.getBaseUrl()}/login`, body, options)
    .map((res: any) => {
...
        if (response.success == 0) {
           _throw(response);  
        } else if (response.success == 1) {
...
        }
    });
}

다음과 같은 오류에 직면한 경우 이 방법이 해결책이 될 것입니다.

오류 유형 오류: WEBPACK_IMPORTED_MODULE_2_rxjs_Observable.관찰 가능한.던지기는 함수가 아닙니다.

일반적으로 오류를 범할 때는 문제가 발생한 정확한 순간에 문제를 제기하고 즉시 문제를 제기해야 하지만 항상 그렇지는 않을 수 있습니다.

예를 들어 다음과 같은 것이 있습니다.timeoutWith()연산자, 이것이 아마도 당신이 이것을 해야 할 가장 가능성이 높은 이유 중 하나일 것입니다.

results$ = server.getResults().pipe(timeoutWith(10000, ....) )

이것은 함수인 '오류 팩토리'를 사용합니다.

 errorFactory = () => 'Your error occurred at exactly ' + new Date()

예를 들면

results$ = server.searchCustomers(searchCriteria).pipe(timeoutWith(10000, 
              () => 'Sorry took too long for search ' + JSON.stringify(searchCriteria)) )

사용 시 주의사항timeoutWith실제 서버 응답을 다시 수신하지 못하므로, 서버가 특정 오류를 발생시킨 경우 이 응답을 볼 수 없습니다.위의 예제는 디버깅에 매우 유용할 수 있지만 위의 예제를 사용하는 경우 일반 사용자에게 오류가 표시되지 않도록 해야 합니다.

오류 팩토리는 실제 오류가 발생할 때까지 코드를 평가하지 않기 때문에 유용합니다.따라서 오류가 실제로 필요할 때 실행되는 '비싼' 또는 디버깅 작업을 내부에 넣을 수 있습니다.

시간 초과가 아닌 다른 곳에서 '공장'을 사용하여 오류를 생성해야 하는 경우 다음을 사용할 수 있습니다.

 EMPTY.pipe(throwIfEmpty(errorFactory)) 

파이프 내부에서 catchError(오류) => console.log(오류)를 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/40511948/how-to-throw-an-observable-error-manually

반응형