관찰 가능한 오류를 수동으로 발생시키는 방법은 무엇입니까?
저는 아래와 같이 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
'programing' 카테고리의 다른 글
어떤 버전의 nltk, scikit learn이 설치되어 있는지 어떻게 확인합니까? (0) | 2023.09.05 |
---|---|
MySQL : 청크별로 큰 선택 항목 검색 (0) | 2023.09.05 |
코드를 사용하여 버튼 클릭을 시뮬레이션하는 방법은 무엇입니까? (0) | 2023.09.05 |
Angular2 http 서비스를 사용하여 결과 캐싱 (0) | 2023.09.05 |
MariaDB 마스터에서 마스터로의 복제 자동 증분이 순차적이지 않음 (0) | 2023.09.05 |