나는 무엇을 사용하는지 궁금합니다 asObservable
.
문서에 따라 :
소스 시퀀스의 ID를 숨기는 관찰 가능한 시퀀스입니다.
하지만 왜 시퀀스를 숨겨야할까요?
답변:
이것의 목적은 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의 기존 연산자를 사용하여 관찰 가능 항목 위에 "게으르지 않게"만드는 것을 포함한 모든 동작을 구성 할 수 있습니다.
result.subscribe(value => doSomething(value))
return subject.asObservable();
새로운 관찰 가능합니다. 단일 Subject 멤버 변수가 있고 onMessage / onOtherMessage는 조건에서 또는 초기화시 (모든 호출이 아님) 선언됩니다. 함수에 pipe( filter() )
제공된 매개 변수를 기반으로하는 방식을 사용했습니다 getData()
. The
subject
있어야하는데 subscriber
?
subject.next
라인 수 subscriber
. 또한 "관측 가능한 결과를 다시 시도하거나 반복하면 예상대로 작동하지 않을 것입니다." 더 자세하게 얘기해 주 시겠어요? 당신 은 호출 new SomeWeirdDataSource()
될 때마다 일어날 것이고 getData
그것을 래핑함으로써 new Observable
당신은 그 인스턴스화가 구독까지 기다릴 수 있다는 것을 의미합니까? 나는 당신이 전화 getData
없이는 언제 전화를할지 알 수 없기 .subscribe
때문에 거기에 가치가 없습니다. 마지막으로 "데이터 소스를 뜯어내는"일이 발생할 것으로 예상하십니까? 감사.
A Subject
는 observer
및 observable
.
An Obervable
에는 두 가지 방법이 있습니다.
를 구독 할 때마다 next , error 및 complete 메소드 가 있는를observable
받게 됩니다.observer
모든 구성 요소에서 스트림 소스를 공개적으로 사용할 수 없도록하려면 시퀀스를 숨겨야합니다. @BenLesh
의 예를 참조 할 수 있습니다 .
추신 : Reactive Javascript를 처음 사용했을 때 이해할 수 없었습니다 asObservable
. 기본 사항을 명확하게 이해 한 다음 asObservable
. :)