rxjs에서 asObservable ()을 언제 사용합니까?


84

나는 무엇을 사용하는지 궁금합니다 asObservable.

문서에 따라 :

소스 시퀀스의 ID를 숨기는 관찰 가능한 시퀀스입니다.

하지만 왜 시퀀스를 숨겨야할까요?

답변:


187

Subject.prototype.asObservable ()을 사용하는 경우

이것의 목적은 API에서 주제의 "관찰자 측"이 유출되는 것을 방지하는 것입니다. 기본적으로 사람들이 결과 관찰 대상에 "다음"으로 들어가는 것을 원하지 않을 때 누출 된 추상화를 방지합니다.

(참고 : 이것은 실제로 이와 같은 데이터 소스를 Observable로 만드는 방법이 아닙니다. 대신 new Observable생성자를 사용해야합니다 . 아래 참조).

const myAPI = {
  getData: () => {
    const subject = new Subject();
    const source = new SomeWeirdDataSource();
    source.onMessage = (data) => subject.next({ type: 'message', data });
    source.onOtherMessage = (data) => subject.next({ type: 'othermessage', data });
    return subject.asObservable();
  }
};

이제 누군가가 관찰 가능한 결과를 얻으면 결과에 가치를 둘 myAPI.getData()수 없습니다 next.

const result = myAPI.getData();
result.next('LOL hax!'); // throws an error because `next` doesn't exist

new Observable()하지만 일반적으로을 사용해야합니다.

위의 예에서 우리는 의도하지 않은 것을 만들고있을 것입니다. 하나를 들어, getData()대부분의 관찰 가능한처럼 게으른 것이 아니라,이 기본 데이터 소스 만들 것 SomeWeirdDataSource즉시 (그리고 아마도 몇 가지 부작용). 이것은 또한 당신 retry이나 repeat결과적으로 관찰 가능한 것이 당신이 생각하는 것처럼 작동하지 않을 것임을 의미합니다.

다음과 같이 Observable 내에서 데이터 소스 생성을 캡슐화하는 것이 좋습니다.

const myAPI = {
  getData: () => return new Observable(subscriber => {
    const source = new SomeWeirdDataSource();
    source.onMessage = (data) => subscriber.next({ type: 'message', data });
    source.onOtherMessage = (data) => subscriber.next({ type: 'othermessage', data });
    return () => {
      // Even better, now we can tear down the data source for cancellation!
      source.destroy();
    };
  });
}

위의 코드를 사용하면 RxJS의 기존 연산자를 사용하여 관찰 가능 항목 위에 "게으르지 않게"만드는 것을 포함한 모든 동작을 구성 할 수 있습니다.


3
TX Ben ... 귀하의 자료를
팔로우

3
@Shardul ... 당신은 결과에 가입 것 :result.subscribe(value => doSomething(value))
벤 레 쉬는

2
@BenTaliadoros 네, 매번 return subject.asObservable();새로운 관찰 가능합니다. 단일 Subject 멤버 변수가 있고 onMessage / onOtherMessage는 조건에서 또는 초기화시 (모든 호출이 아님) 선언됩니다. 함수에 pipe( filter() )제공된 매개 변수를 기반으로하는 방식을 사용했습니다 getData(). The
Drenai

5
@BenLesh, 두 번째 코드 샘플에 subject있어야하는데 subscriber?
Florin D

1
또한 여기 검증 하시겠습니까 다음해야 subject.next라인 수 subscriber. 또한 "관측 가능한 결과를 다시 시도하거나 반복하면 예상대로 작동하지 않을 것입니다." 더 자세하게 얘기해 주 시겠어요? 당신 은 호출 new SomeWeirdDataSource()될 때마다 일어날 것이고 getData그것을 래핑함으로써 new Observable당신은 그 인스턴스화가 구독까지 기다릴 수 있다는 것을 의미합니까? 나는 당신이 전화 getData없이는 언제 전화를할지 알 수 없기 .subscribe때문에 거기에 가치가 없습니다. 마지막으로 "데이터 소스를 뜯어내는"일이 발생할 것으로 예상하십니까? 감사.
1252748

7

A Subjectobserverobservable.

An Obervable에는 두 가지 방법이 있습니다.

  • 구독
  • 구독 취소

구독 할 때마다 next , errorcomplete 메소드 가 있는를observable 받게 됩니다.observer

모든 구성 요소에서 스트림 소스를 공개적으로 사용할 수 없도록하려면 시퀀스를 숨겨야합니다. @BenLesh의 예를 참조 할 수 있습니다 .

추신 : Reactive Javascript를 처음 사용했을 때 이해할 수 없었습니다 asObservable. 기본 사항을 명확하게 이해 한 다음 asObservable. :)

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