2017-02-03 7 views
1

Я пытаюсь понять поведение оператора RxJS 5share().Понимание доли() Оператор RxJS в действии вместе с Rx.Observable.ajax

Согласно учебникам и документации, share() превращает холодный наблюдаемый в горячий.

Я стараюсь видеть это в действии. Вот то, что я пробовал:

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

И тогда я в первый раз подписаться на него:

search$.subscribe(console.log); 

Я вижу из Дев инструментов, выдается запрос сети:

Request URL:https://www.googleapis.com/books/v1/volumes?q=javascript 

затем при повторной такой же подписке:

search$.subscribe(console.log); 

Я замечаю, что другой сетевой запрос также выдается.

Может кто-то объяснить, что это такое? share() Операция отображает это поведение? Я ожидал, что будет выдан только один запрос на сеть ...

P.S. с использованием xxx.publishLast().refCount(); вместо xxx.share(); выполняет эту работу, но моя главная задача - понять поведение share() в приведенном выше контексте.

ответ

2

share является ярлыком для publish().refCount(). Значение refCount -part означает, что поток является горячим/общим, если существует как минимум 1 абонент - все равно, он сбрасывается/холоден, когда нет подписчиков. Когда ваши ajax -requests заканчиваются, поток завершается, и по завершении потока любой абонент автоматически отписывается -> устанавливает субпригары потока на 0 и, следовательно, перезагружает поток - вот почему вы испытываете второй сетевой квест на любая будущая подписка.

Почему это работает с publishLast().refCount()? - с publishLast() вы получаете поток, который никогда не завершается, поэтому абонент автоматически не подписывается и поток никогда не сбрасывается.


для кэширования HTTP-ответов вашего подхода с publishLast().refCount() вполне допустим.

+0

Спасибо, olsn. Это делает проявленное поведение более ясным. Еще один опрос, который у меня есть: является 'publishLast(). RefCount()' и подразумеваемый никогда-завершающий поток считается хорошей практикой для кэширования HTTP-запросов? – balteo

+0

Да абсолютно - но я обновил ответ с дополнительной ссылкой на раздел rxjs-doc здесь, на SO – olsn

+0

Большое спасибо за этот подробный ответ и ссылку! – balteo

 Смежные вопросы

  • Нет связанных вопросов^_^