RxJS - 오류가 발생하면 관측 가능이 완료되지 않습니다.
처음부터 관찰 가능한 항목을 만들고 관찰자 오류가 발생한 후 완료하면 구독의 완료된 부분이 실행되지 않습니다.
var observer = Rx.Observable.create(function(observer){
observer.onError(new Error('no!'));
observer.onCompleted();
})
observer.subscribe(
function(x) { console.log('succeeded with ' + x ) },
function(x) { console.log('errored with ' + x ) },
function() { console.log('completed') }
)
출력은 다음과 같습니다.
errored with Error: no!
저는 그렇게 예상:
errored with Error: no!
completed
코드를 onError가 아닌 next에서 호출하도록 변경하면 관찰 파일이 적절하게 완료됩니다.
var observer = Rx.Observable.create(function(observer){
observer.onNext('Hi!');
observer.onCompleted();
})
observer.subscribe(
function(x) { console.log('succeeded with ' + x ) },
function(x) { console.log('errored with ' + x ) },
function() { console.log('completed') }
)
예상 출력은 다음과 같습니다.
succeeded with Hi!
completed
오류가 발생했는데도 완료되지 않는 이유는 무엇입니까?
오류는 완료를 의미하기 때문에 콜백은 다음과 관련이 있습니다.onCompleted한 번도 안 불러요여기에서 관찰 가능한 것에 대한 Rxjs 계약을 검토할 수 있습니다(http://reactivex.io/documentation/contract.html) :
Observable은 각각 단일 방출 항목을 나타내는 0개 이상의 OnNext 알림을 생성할 수 있으며, OnCompleted 또는 OnError 알림을 따르는 경우가 있지만 둘 다는 아닙니다.OnCompleted 또는 OnError 알림을 발행하면 이후에는 더 이상의 알림을 발행하지 않을 수 있습니다.'
오류 관리는 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/errors.md 에서 확인할 수 있습니다.
또 다른 그리고 아마도 가장 간단한 해결책은add()기능.
문은 오류 발생 여부에 관계없이 항상 실행됩니다(예:finally대부분의 프로그래밍 언어에서 문장(state)을 사용합니다.
observer.subscribe(
function(x) { console.log('succeeded with ' + x ) },
function(x) { console.log('errored with ' + x ) },
function() { console.log('completed') }
)
.add(() => {
console.log("Will be executed on both success or error of the previous subscription")
);
같은 질문을 받다가 이 github 문제에 부딪혔습니다.
보아하니finally의 방법Observable이 경우 개체를 사용해야 합니다.
Aleksandr-Leotech에서 인용한 내용입니다.
완전한 것과 마지막으로 완전히 다른 것들입니다.완료는 관측 가능한 증기가 성공적으로 완료되었음을 의미합니다.성공콜이 많이 나올 수 있기 때문입니다.마지막으로 증기가 성공적이든 아니든 종료되었음을 의미합니다.
HTTP 요청에서는 명확하지 않지만 두 가지 시나리오를 추가로 상상해 보십시오.
마우스 이벤트.성공 콜백은 계속되지만, 사용자 이벤트가 절대 멈추지 않기 때문에 최종 또는 완료되지는 않습니다(버기 코드로 예외를 트리거하지 않는 한 오류가 발생하고 최종적으로 오류가 발생합니다).
웹 소켓으로 작업 중입니다.성공 콜백이 여러 번 발생하지만, 어느 시점에서 백엔드와의 통신이 중단되고 오류가 발생하지 않는 한 둘 다 완료되고 최종적으로 오류를 호출합니다.
따라서 성공 호출이 여러 번 발생하거나 아예 발생하지 않거나, 오류 호출이 제로 또는 한 번 발생하거나, 완료된 호출 또는 완료된 호출 또는 완료된 호출이 제로 또는 마지막으로 한 번 발생할 수 있습니다.
관찰 가능한 완료 또는 오류가 있을 때 콜백을 실행하려면 다음을 사용해야 합니다.finalize.
예:
this.service.yourObservable
.pipe(
finalize(() => {
// * This will always run when observable finishes the stream
console.log("Finally!");
// * callback for finally
})
).subscribe(
{
next: () => { // * Callback for success },
error: () => { // * Callback for error },
complete: () => {// * This gets called only on success }
})
언급URL : https://stackoverflow.com/questions/33783967/rxjs-observable-doesnt-complete-when-an-error-occurs
'programing' 카테고리의 다른 글
| (및 배열)의 크기는 얼마나 됩니까? (0) | 2023.10.27 |
|---|---|
| 쓰기가 버퍼에 지속적으로 4K 바이트를 남기는 이유는 무엇입니까? (0) | 2023.10.27 |
| 시작 작업의 스크립트 블록에 제기된 예외를 캡처하는 방법은? (0) | 2023.10.27 |
| Python의 추상 속성 (0) | 2023.10.27 |
| PHP 준비문 SQL with where 값 (0) | 2023.10.27 |