에 따르면 이 기사에 , onComplete
그리고onError
의 함수 subscribe
상호 배타적이다.
의미 중 하나 onError
또는 onComplete
이벤트 내에서 실행됩니다 subscribe
.
오류를 받거나 정보의 흐름을 성공적으로 마칠 때 실행해야하는 논리 블록이 있습니다.
나는 finally
python 에서 와 같은 것을 찾았지만 내가 찾은 것은 finally
내가 만든 관찰 대상에 첨부해야한다는 것뿐입니다.
그러나 나는 구독 할 때만, 그리고 성공적 으로든 오류가 있든 스트림이 종료 된 후에 만 그 논리를하고 싶다.
어떤 아이디어?
답변
이 연산자의 현재 “파이프 가능한”변형이 호출됩니다 finalize()
(RxJS 6부터). 오래되고 현재는 사용되지 않는 “패치”연산자가 호출되었습니다 finally()
(RxJS 5.5까지).
finalize()
연산자가 실제로 맞다고 생각 합니다. 당신은 말한다 :
구독 할 때만 해당 논리를 수행하고 스트림이 종료 된 후에
제 생각에는 문제가되지 않습니다. 원하는 경우 구독하기 전에 싱글 source
을 사용하여 사용할 수 있습니다 finalize()
. 이렇게하면 항상 다음을 사용할 필요가 없습니다 finalize()
.
let source = new Observable(observer => {
observer.next(1);
observer.error('error message');
observer.next(3);
observer.complete();
}).pipe(
publish(),
);
source.pipe(
finalize(() => console.log('Finally callback')),
).subscribe(
value => console.log('#1 Next:', value),
error => console.log('#1 Error:', error),
() => console.log('#1 Complete')
);
source.subscribe(
value => console.log('#2 Next:', value),
error => console.log('#2 Error:', error),
() => console.log('#2 Complete')
);
source.connect();
이것은 콘솔에 인쇄됩니다.
#1 Next: 1
#2 Next: 1
#1 Error: error message
Finally callback
#2 Error: error message
2019 년 1 월 : RxJS 6 업데이트
답변
나를 위해 일한 유일한 것은 이것입니다
fetchData()
.subscribe(
(data) => {
//Called when success
},
(error) => {
//Called when error
}
).add(() => {
//Called when operation is complete (both success and error)
});
답변
이제 Angular 응용 프로그램에서 RxJS 5.5.7을 사용하고 있습니다. finalize
하고 있으며 연산자를 사용하면 성공 또는 오류 콜백 전에 시작되기 때문에 내 사용 사례에 이상한 동작이 있습니다.
간단한 예 :
// Simulate an AJAX callback...
of(null)
.pipe(
delay(2000),
finalize(() => {
// Do some work after complete...
console.log('Finalize method executed before "Data available" (or error thrown)');
})
)
.subscribe(
response => {
console.log('Data available.');
},
err => {
console.error(err);
}
);
내가 add
원하는 것을 달성하기 위해 구독 에서 medhod 를 사용해야했습니다 . 기본적으로 finally
성공 또는 오류 콜백이 완료된 후의 콜백입니다. 유사한 try..catch..finally
블록 또는Promise.finally
방법 .
간단한 예 :
// Simulate an AJAX callback...
of(null)
.pipe(
delay(2000)
)
.subscribe(
response => {
console.log('Data available.');
},
err => {
console.error(err);
}
);
.add(() => {
// Do some work after complete...
console.log('At this point the success or error callbacks has been completed.');
});