programing

RxJS - 오류가 발생하면 관측 가능이 완료되지 않습니다.

jooyons 2023. 10. 27. 21:54
반응형

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 요청에서는 명확하지 않지만 두 가지 시나리오를 추가로 상상해 보십시오.

  1. 마우스 이벤트.성공 콜백은 계속되지만, 사용자 이벤트가 절대 멈추지 않기 때문에 최종 또는 완료되지는 않습니다(버기 코드로 예외를 트리거하지 않는 한 오류가 발생하고 최종적으로 오류가 발생합니다).

  2. 웹 소켓으로 작업 중입니다.성공 콜백이 여러 번 발생하지만, 어느 시점에서 백엔드와의 통신이 중단되고 오류가 발생하지 않는 한 둘 다 완료되고 최종적으로 오류를 호출합니다.

따라서 성공 호출이 여러 번 발생하거나 아예 발생하지 않거나, 오류 호출이 제로 또는 한 번 발생하거나, 완료된 호출 또는 완료된 호출 또는 완료된 호출이 제로 또는 마지막으로 한 번 발생할 수 있습니다.

관찰 가능한 완료 또는 오류가 있을 때 콜백을 실행하려면 다음을 사용해야 합니다.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

반응형