Rx BehaviorSubject + skenovat tlačí před události do nové předplatitele?

hlasů
3

Chci mít proud, k němuž můžu tlačit reduktoru funkce. Pokaždé, když je funkce redukce je tlačena, musí být objekt stavu předán do reduktoru, měla by redukční vrátit upravený státní hodnotu a aktualizovaný stav by měl být tlačen k předplatitelům. Doufám, že můj kód lze vysvětlit:

import Rx from 'rx';
import { Map } from 'immutable';

let initialState = Map({ counter: 0 });

export let upstream = new Rx.BehaviorSubject(Rx.helpers.identity);
export let downstream = upstream.scan((state, reducer) => {
  return reducer(state);
}, initialState);

let increment = state => {
  return state.update('counter', counter => counter + 1);
};

upstream.onNext(increment);

downstream.subscribe(state => {
  console.log('subscriptionA', state.get('counter'));
});

upstream.onNext(increment);

setTimeout(() => {
  downstream.subscribe(state => {
    console.log('subscriptionB', state.get('counter'));
  });
}, 3000);

Zde je výstup vidím:

subscriptionA 1
subscriptionA 2
subscriptionB 1

když jsem doufal, že uvidí:

subscriptionA 1
subscriptionA 2
subscriptionB 2

Samozřejmě, že jsem něco chybí zásadní zde. Zdá se, že BehaviorSubjectmá zachovat aktuální hodnoty pro nové předplatitele, který by mě si myslí, že když subscriptionBse přihlásí k odběru downstream, že by získat nejnovější sníženou hodnotu, ale vypadá to, mající .scanve středu fauloval to rozjet ... nebo tak něco.

To, co se tady děje, a jak jsem se dosáhnout toho, co jsem se snaží dosáhnout? Dík!

Položena 06/12/2015 v 03:20
uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Mám řešení, které se zdá být, že mi výsledky jsem hledají. Já bych ocenil, kdyby jiní mohli ověřit, že to je vhodným řešením.

import Rx from 'rx';
import { Map } from 'immutable';

let initialState = Map({ counter: 0 });

export let upstream = new Rx.Subject();

let downstreamSource = upstream.scan((state, reducer) => {
  return reducer(state);
}, initialState);

export let downstream = new Rx.BehaviorSubject(initialState);
downstreamSource.subscribe(downstream);

let increment = state => {
  return state.update('counter', counter => counter + 1);
};

upstream.onNext(increment);

downstream.subscribe(state => {
  console.log('subscriptionA', state.get('counter'));
});

upstream.onNext(increment);

setTimeout(() => {
  downstream.subscribe(state => {
    console.log('subscriptionB', state.get('counter'));
  });
}, 3000);
Odpovězeno 06/12/2015 v 03:42
zdroj uživatelem

hlasů
3

Můžete se pokusit zjistit, zda je vše v souladu se vaše očekávání, pokud jste nahradit

export let downstream = upstream.scan((state, reducer) => {
  return reducer(state);
}, initialState);

podle

export let downstream = upstream.scan((state, reducer) => {
  return reducer(state);
}, initialState).shareReplay(1);

jsfiddle zde: http://jsfiddle.net/cqaumutp/

Pokud ano, jste další obětí horkého vs. chladnou povahu Rx.Observable, nebo možná přesněji líné instance rozpoznatelnosti.

Stručně řečeno (ne tak krátký), co se stane pokaždé, když to dělá subscribe, je, že řetězec rozpoznatelnosti je vytvořen tím, že jde proti proudu řetězci operátorů. Každý provozovatel přihlásil ke svému zdroji a vrací další pozorovatelný až ke zdroji výchozího. Ve vašem případě, když se přihlásíte k odběru scan, scansi předplatí upstreamcož je poslední. upstreamJelikož se jedná o téma, o upsání to prostě registruje účastníka. Jiné zdroje by dělat i jiné věci (jako je zaregistrovat posluchače na DOM uzel, nebo zásuvky, nebo cokoliv).

Pointa je, že pokaždé, když se přihlásíte do scan, začnete znovu, tedy s initialState. Chcete-li použít hodnoty z prvního upisování scan, budete muset použít shareoperátor. Na prvním upisování share, bude to projít vaši žádost předplatného k scan. Na druhém a dalších ty, nebude to, že budou zaregistrovat a předat příslušného pozorovatele všechny hodnoty přicházející z scannejprve k odběru.

Odpovězeno 06/12/2015 v 12:15
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more