Разлика между `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 repo за подробно обяснение на разликите - person Christian; 27.02.2016
comment
@Christian В момента съм изправен пред проблем в приложение Angular2. Имам Observable от http-заявка с множество Observers. Инструментите за разработчици на моя браузър записват около 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

Според статия „Rxjs Observable public refcount vs share";

С observable.publish().refCount(), след като наблюдателят завърши, той няма да се рестартира, ако се добави нов абонат след завършването. Докато при observable.share(), ако основният наблюдател завърши и по-късно се добави нов абонат, наблюдателят ефективно започва ново изпълнение и започва да излъчва данни.

person Teoman shipahi    schedule 05.04.2020