Разница между `share()` и `publish().refCount()`

Какая практическая разница между observable.publish().refCount() и observable.share(). Что может быть примером сценария, в котором мы не хотим использовать share?


person Sergi Mansilla    schedule 07.06.2015    source источник
comment
system.reactive — это тег .Net.   -  person i3arnon    schedule 07.06.2015


Ответы (2)


Практической разницы нет, если вы посмотрите на «observable.prototype.share», вы увидите, что он просто возвращает «source.publish().refCount()».

Что касается того, почему вы хотели бы использовать его, это больше вопрос того, какой контроль вам нужен, когда ваш источник начинает вещание.

Поскольку refCount() прикрепит базовый наблюдаемый объект при первой подписке, вполне может случиться так, что последующие наблюдатели пропустят сообщения, поступающие до того, как они смогут подписаться.

Например:

var source = Rx.Observable.range(0, 5).share();

var sub1 = source.subscribe(x => console.log("Observer 1: " + x));
var sub2 = source.subscribe(x => console.log("Observer 2: " + x));

Только первый подписчик получит какие-либо значения, если мы хотим, чтобы оба получили их, мы бы использовали:

var source = Rx.Observable.range(0, 5).publish();

var sub1 = source.subscribe(x => console.log("Observer 1: " + x));
var sub2 = source.subscribe(x => console.log("Observer 2: " + x));

source.connect();
person paulpdaniels    schedule 07.06.2015
comment
В rxjs 5 есть разница между двумя вариантами использования оператора. См. эту проблему, которую я разместил в репозитории rxjs 5 для подробного объяснения различий - person Christian; 27.02.2016
comment
@Christian В настоящее время я сталкиваюсь с проблемой в приложении Angular2. У меня есть Observable http-запроса с несколькими Observer. Инструменты разработчика моего браузера фиксируют около 750 запросов на задачу. Когда я меняю share() на publish.refCount(), для одной и той же задачи остается только 50 запросов. Так что похоже, что share() не делает того, что должно (поделитесь Observable). - person Springrbua; 24.05.2016
comment
Также см. этот выпуск для различий github.com/ReactiveX/rxjs/issues/1914 - person Oliver Joseph Ash; 25.05.2017
comment
Пример с share() означает, что первый результат range() является синхронным, а это означает, что невозможно иметь состояние гонки, когда обе подписки получают значение? - person Alex Pineda; 12.10.2017
comment
Не уверен, как обстояло дело так давно, но, глядя на Stackblitz, сейчас он ведет себя иначе, чем ответ: stackblitz.com/edit/rxjs-cdragb - person Silvos; 29.04.2021