구독시 마지막으로 관찰 가능


105

에 따르면 이 기사에 , onComplete그리고onError 의 함수 subscribe상호 배타적이다.

의미 중 하나 onError또는 onComplete이벤트 내에서 실행됩니다 subscribe.
오류를 받거나 정보의 흐름을 성공적으로 마칠 때 실행해야하는 논리 블록이 있습니다.

나는 finallypython 에서 와 같은 것을 찾았지만 내가 찾은 것은 finally내가 만든 관찰 대상에 첨부해야한다는 것뿐입니다.

그러나 나는 구독 할 때만, 그리고 성공적 으로든 오류가 있든 스트림이 종료 된 후에 만 ​​그 논리를하고 싶다.

어떤 아이디어?

답변:


130

이 연산자의 현재 "파이프 가능한"변형이 호출됩니다 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 업데이트


1
finally()메서드가 먼저 추가되고 구독이 반드시 통과 / 실패를 강제 한다는 점에서 Promises의 반대 패턴이라는 점이 흥미 롭습니다.
BradGreens 2017 년

7
그래, 너무 나쁘다. finally블록이 코드에서 마지막에 올 것이라고 생각할 것입니다 .
d512

D512은 ... 나는 "마지막으로"모든에서 다음과 같이 마지막 ... 할 일을 할 것으로 예상 말했듯이 나는 ... 각도 JS의 약속 시스템을 좋아
Sampgun

10
RXJS 5.5부터 "finally"는 더 이상 Observable 메서드가 아닙니다. 대신 "finalize"연산자를 사용하십시오. source.pipe (finalize (() => console.log ( 'Finally callback'))). subscribe (...); github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md
Stevethemacguy

finalize의 문제는 "complete ()"호출을 기다린다는 것입니다. 각 방출에 대해 최종적으로 a를 원한다면 어떻게 될까요? (관찰 가능한 방출이 성공하면 a , 오류가 있으면 b 대신 .. 두 경우 모두 c )?
로베르토 토마스

65

나를 위해 일한 유일한 것은 이것입니다

fetchData()
  .subscribe(
    (data) => {
       //Called when success
     },
    (error) => {
       //Called when error
    }
  ).add(() => {
       //Called when operation is complete (both success and error)
  });

26

이제 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.');
  });

기꺼이 도와 드리겠습니다.
pcasme
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.