2017-02-03 1 views
1

RxJS 5share() 연산자의 동작을 이해하려고합니다.공유() RxJS 운영자가 Rx.Observable.ajax와 함께 작동 중

튜토리얼 및 설명서에 따르면 share()은 콜드 관측 대상을 뜨거운 대상으로 바꿉니다.

나는 그 행동을 보려고합니다. 여기에 내가 시도 무엇인가 : 다음

const search$ = Rx.Observable.ajax('https://www.googleapis.com/books/v1/volumes?q=javascript').share(); 

그리고 처음 내가 가입 시간 :

Request URL:https://www.googleapis.com/books/v1/volumes?q=javascript 
: 내가 네트워크 요청이 발행하는 개발 도구에서 볼

search$.subscribe(console.log); 

다음에 동일한 서브 스크립 션을 다시 실행하면 :

search$.subscribe(console.log); 

다른 네트워크 요청도입니다.

누군가가 share() 운영자가이 동작을 표시하는 이유를 설명해주십시오. 하나의 네트워크 요청이 발행 될 것으로 예상 했었습니다 ...

P.S.xxx.share(); 대신 xxx.publishLast().refCount();을 사용하면 위와 같은 상황에서 share() 동작을 이해해야합니다.

답변

2

sharepublish().refCount()의 바로 가기입니다. refCount -part는 구독자가 한 명 이상있는 한 스트림이 핫/공유됨을 의미합니다. 구독자가없는 경우 스트림은 재설정/감기 중입니다. ajax 요청이 완료되면 스트림이 완료되고 스트림이 완료되면 구독자가 자동으로 구독 취소됩니다. - 스트림의 구독자를 0으로 설정하여 스트림을 재설정합니다. 따라서 두 번째 네트워크가 발생합니다. 향후 구독.

왜이 작동합니까 publishLast().refCount()? - publishLast()으로 완료되지 않는 스트림이 생기면 구독자가 자동으로 구독 취소되고 스트림이 재설정되지 않습니다.


HTTP 응답을 캐싱하려면 publishLast().refCount()을 사용하는 접근 방식이 완벽합니다.

+0

감사합니다. olsn. 이것은 이제 전시 된 행동을보다 분명하게 만듭니다. 필자가 한 번만 더 심문하는 것은'publishLast(). refCount()'이며 http 요청을 캐싱하기 위해 묵시적으로 완료되지 않은 스트림이 좋은 습관으로 간주됩니까? – balteo

+0

예 -하지만 여기 rxjs-doc-section에 대한 추가 링크로 답변을 업데이트했습니다. – olsn

+0

감사합니다.이 detailled 답장과 링크를 많이 보내 주셔서 감사합니다! – balteo